Python girinti nasıl düzeltilir?


264

Tutarsız girinti olan bazı Python kodlarım var. Konuyu daha da kötüleştirmek için çok sayıda sekme ve boşluk karışımı vardır ve hatta boşluk girintisi korunmaz.

Kod beklendiği gibi çalışır, ancak bakımı zordur.

Girintiyi ( HTML Tidy gibi , ancak Python için) kodu kırmadan nasıl düzeltebilirim ?


bu bağlantıyı inceleyebilir ve reindent.py modülünün nasıl kullanılacağına dair girişlerinizi sağlayabilir misiniz - stackoverflow.com/questions/12132481/instal-reindent-python/…
user1050619 26:02

@ Andy-hayden tarafından aşağıda belirtildiği gibi bu ilgili soruya bakın - temel olarak autopep8girinti sağlar ve çok daha fazlası: stackoverflow.com/questions/14328406/…
Pierz

2
Bu çok faydalı bir soru, kendimi bunu çok sık yapmaya ihtiyaç duyuyorum. Bu "nasıl yapılacağı" kadar "bir araç tavsiye etmek" ile ilgili değildir.
Andy Hayden

Yanıtlar:


282

Python kurulumunuzun dizininde reindent.pybulduğunuz komut dosyasını kullanın Tools/scripts/:

Python (.py) dosyalarını, 4 boşluklu girintiler kullanacak ve sabit sekme karakteri kullanmayacak şekilde değiştirin. Ayrıca satır sonlarındaki fazla boşlukları ve sekmeleri kesin ve dosyaların sonundaki boş satırları kaldırın. Ayrıca son satırın bir satırsonu ile sonlandığından emin olun.

Ayrıntılı kullanım talimatları için bu komut dosyasına bir göz atın.


51
Ne yazık ki, Debian ve Ubuntu'daki normal Python kurulumunun bir parçası değildir; python-examplespakete ayrılmıştır .
ephemient

16
Mükemmel! Dolayısıyla Debian ve Ubuntu kullanıcılarının tek yapması gereken bu paketi almaktır. Alternatif olarak, komut dosyası da svn.python.org/view/python/trunk/Tools/scripts/… adresindedir .
Alex Martelli

9
@Shay Erlichmen: "python -tt yourscript.py" komutunu deneyin
nosklo

8
Fedora / RedHat / CentOS kullanıcıları "python-tools" paketini kurmalıdır.
Cristian Ciupitu

26
Sadece ephemient'in yorumuna eklemek için: bir kez python-exampleskurulduktan sonra , içinde rivayet bulacaksınız /usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py.
Larry Hastings

59

Vim kullanıyorsanız , bkz :h retab.

                                                        *: ret * *: retab *
: [aralık] ret [ab] [!] [new_tabstop]
                        Bir boşluk içeren tüm beyaz boşluk dizilerini değiştirin
                        <Tab> yeni boşlukları kullanarak yeni boşluklar
                        tabstop değeri verildi. Yeni bir şey belirtmezseniz
                        sekme boyutu veya sıfır, Vim geçerli değeri kullanır
                        tabstop.
                        Mevcut 'tabstop' değeri her zaman için kullanılır
                        mevcut sekmelerin genişliğini hesaplar.
                        İle !, Vim ayrıca sadece normal dizelerin yerini alır
                        sekmeleri olan boşluklar.
                        'Expandtab' açıkken, Vim tüm sekmeleri
                        uygun sayıda boşluk.
                        Bu komut, 'tabstop'u verilen yeni değere ayarlar,
                        ve varsayılan olarak tüm dosya üzerinde gerçekleştirilirse,
                        görünür bir değişiklik yapmamalıdır.
                        Dikkat: Bu komut <Sekme> karakterlerini değiştirir
                        C programındaki dizgilerin içinde. Önlemek için "\ t" kullanın
                        bu (bu zaten iyi bir alışkanlık).
                        ": Retab!" bir boşluk dizisini
                        <sekme> karakterleri, bir printf () işlevini bozabilir.
                        {Vi'da değil}
                        | + Ex_extra | özelliği şurada devre dışı bırakıldı:
                        Derleme zamanı.

Örneğin,

: ret

tüm sekmeleriniz boşluklara genişletilecek.

İsteyebilirsiniz

: se et "kısayol için: set expandtab

yeni satırların değişmez sekmeler kullanmayacağından emin olmak için.


Vim kullanmıyorsanız,

perl -i.bak -pe "s / \ t / '' x (8-pos ()% 8) / örneğin" file.py

sekme boşluklarla değiştirilir, sekme her 8 karakterde bir durur file.py(orijinal file.py.bakdurumda olacak şekilde ). Sekme duraklarınız her 4 boşlukta ise 8'leri 4s ile değiştirin.


2
İyi çalıştı. Sekme girinti karışımını düzeltmenin en kolay yolu budur.
Srikant

Elbette en kolay yol değil.
CONvid19

52

Bunu yapmak için autopep8'e ulaşacaktım :

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Not: E101 ve E121 pep8 girintisidir (Bence --select=E1girintiyle ilgili tüm sorunları düzeltmek için geçebilirsiniz - E1 ile başlayanlar).

Özyinelemeli bayrağı kullanarak bunu tüm projenize uygulayabilirsiniz:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

Ayrıca bkz. Python kodunu PEP8 uyumlu olacak şekilde dönüştürme aracı .


bu harika ... python için ruby ​​rubocop gibi bir araç arıyordum
OkezieE

1
autopep8sözdizimi yanlışsa başarısız olur. kullanarakpython -tt <file.py>
Nishant

47

autopep8 -i script.py

Autopep8 kullanın

autopep8 Automagically formatları Python kodu uymak için PEP 8 nullstylerehber. pep8Yardımcı programın hangi bölümlerin nullcodebiçimlendirilmesi gerektiğini belirlemek için kullanır . tarafından bildirilebilecek sorunların autopep8çoğunu nullformattingçözebilir pep8.

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

i "ithalat os" ve daha önce 4 boşluk ile sadece bir satır kodu var ama onun bir girintili değil .... herhangi bir neden
pkm

3
@pkm 4 boşluk (veya 4'ün katı olan herhangi bir girinti) PEP8'in bir parçasıdır
rbaleksandar

13

Vim'i kullanmak, vurmaktan Escve sonra yazmaktan daha fazla yer almamalıdır .

:%s/\t/    /g

... değiştirmek istediğiniz dosyada. Bu, tüm sekmeleri dört boşluğa dönüştürür. Tutarsız aralığınız da varsa, bu daha zor olacaktır.


11
orijinal kodlayıcıları izleyebilir ve gelişmiş sorgulama teknikleri uygulayabilir misiniz? Tutarsız girintili koddan daha kötü bir şey yoktur.
Ben Hughes

3
@Ben Tutarsız girinti bu adam bizim sorunların en az :)
Shay Erlichmen


5

UNIX benzeri sistemlerin çoğunda şunları da çalıştırabilirsiniz:

expand -t4 oldfilename.py > newfilename.py

sekmeleri 4 dışında bir dizi boşlukla değiştirmek istiyorsanız sayıyı değiştirme. Orijinal dosya adlarını koruyarak bunu aynı anda bir grup dosyayla yapmak için kolayca bir kabuk betiği yazabilirsiniz.


1
Aynı dosyayı kullanmanın işe yaramadığını ve size boş bir dosya bıraktığını unutmayın, ancak bu cevap aslında işe yarıyor ve sekmelerimi boşluklara dönüştürmem gerektiğinde kullanıyorum. Aşağı oyu açıklayan olabilir mi? Ben +1 olurum.
S. Kerdel

Üzerine yazılan dosyayı kurtarmanın olası bir yolu var mı? Sadece yukarıdaki yöntemi kullandım ve benim gün kod değeri facepalm ortadan kayboldu . Teşekkürler
Simas

4

Tembelseniz (benim gibi), dağınık girinti için otomatik düzeltme aracı olan Wingware Python IDE'nin deneme sürümünü de indirebilirsiniz. Oldukça iyi çalışıyor. http://www.wingware.com/


4

Bazı eksik modül nedeniyle reindent komut dosyası benim için çalışmadı. Her neyse, sedişi benim için mükemmel yapan bu komutu buldum :

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
Geçersiz seçenekler -r.
HelloWorld

2

Emacs'ı deneyin. Python'da gerekli girinti için iyi bir desteğe sahiptir. Lütfen bu bağlantıyı kontrol edin http://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm


2
python-modu Python yazmak için güzeldir, ancak bağlantıdaki hiçbir şey mevcut bir dosyadaki girintinin nasıl düzeltileceğini açıklamaz .
ephemient

5
MX Untabify, sekmeleri emacs'ta uzaya dönüştürecek
Paul Hildebrandt

Bağlantı (etkin) koptu. "C Yeni Başlayanlar için Programlama Dili" (!) Başlıklı bir sayfaya yönlendirir .
Peter Mortensen


0

Bu sorun için basit bir çözümüm var. Önce ": retab" ve sonra ": retab!" Yazabilirsiniz, sonra her şey iyi olur


1
:retabHangi bağlamda " " yazın. İçinde Vim ?
Peter Mortensen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.