Python kodunu PEP8 uyumlu olacak şekilde dönüştürmek için araç


113

Ben PEP8, örneğin her ikisi de vardır ile Python kodu uyumlu olup olmadığını doğrulamak araçlar vardır biliyor çevrimiçi bir hizmet ve bir piton modülü .

Bununla birlikte, Python dosyamı kendi kendine yeten, PEP8 geçerli bir Python dosyasına dönüştürebilecek bir servis veya modül bulamıyorum . Varsa bilen var mı?
PEP8'in tamamen kodun görünümü ile ilgili olduğunu varsayıyorum, değil mi?


1
Kodu PEP8 uyumlu koda dönüştüren herhangi bir araç olduğunu sanmıyorum. PEP8, değişken adlandırma kurallarını da içeriyordu, bu nedenle, eğer böyle bir araç varsa, değişken adlarınızı da yeniden adlandıracaktır ve o zaman kendi kodunuzu anlayamayabilirsiniz.
Ashwini Chaudhary

1
@AshwiniChaudhary Bu iyi bir nokta, ayrıca değişken adlarını değiştirmenin halihazırda kodunuzu kullanan diğer kişileri etkileyebileceğini belirtmekte fayda var, bu nedenle bu her zaman iyi bir fikir değildir. (autopep8 bunu yapmaz.)
Andy Hayden

Yanıtlar:


38

Ne yazık ki "pep8 fırtınasının" (tüm proje) birkaç olumsuz yan etkisi vardır:

  • çok sayıda birleştirme çatışması
  • git suçu kır
  • kod incelemesini zorlaştırmak

Alternatif olarak (ve fikir için @yp sayesinde ), yalnızca son commit / dallanmadan beri üzerinde çalıştığınız satırları autopep8s eden küçük bir paket yazdım:

Temel olarak projeyi bulduğunuzdan biraz daha iyi bırakmak :

pip install pep8radius

İşinizi tamamladığınızı masterve taahhüt etmeye hazır olduğunuzu varsayalım :

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

Veya son işlemden bu yana taahhüt ettiğiniz yeni satırları temizlemek için:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

Temel pep8radiusolarak git / hg diff çıktısındaki satırlara autopep8 uygulamaktır ( son paylaşılan kaydetmeden ).

Bu komut dosyası şu anda git ve hg ile çalışıyor, eğer başka bir şey kullanıyorsanız ve bunun çalışmasını istiyorsanız lütfen bir yorum / sayı / PR gönderin!


2
+1 çok iyi girişim ... aynı amaç için bir Notepad ++ eklentisinin nasıl yapılacağını düşünüyorum ... Windows'daki en sevdiğim düzenleyicidir
kmonsoor

1
@kmonsoor iyi fikir, editör eklentilerini düşünmemiştim! Yardım edebileceğim / CLI dışında kullanımını kolaylaştırabileceğim herhangi bir şekilde github'da bana haber verin ... Birkaç (çözülebilir) sorun görüyorum.
Andy Hayden

burada ilginç bir editör eklentileri listesi buldum github.com/jcrocholl/pep8/wiki/RelatedTools , ancak Notepad ++ için şans yok ...
kmonsoor

1
Başka bir eklenti olan "Python Script" 'e dayanarak Notepad ++ ve Autopep8 arasında köprü kurmak için bir betik oluşturdum. Ancak işe yarıyor. Plz burayı kontrol edin: bit.ly/pep8_tonizer
kmonsoor

185

Autopep8'i kullanabilirsiniz ! Kendinize bir fincan kahve hazırlarken, bu araç kodun anlamını değiştirmeyen tüm sinir bozucu PEP8 ihlallerini mutlu bir şekilde ortadan kaldırır .

Pip ile kurun:

pip install autopep8

Bunu belirli bir dosyaya uygulayın:

autopep8 py_file --in-place

veya projenize (özyinelemeli olarak), ayrıntılı seçeneği size nasıl gittiğine dair bazı geri bildirimler verir :

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

Not: Bazen 100 geçişin varsayılan değeri yeterli değildir, makul derecede yüksek olduğu için 2000 olarak ayarlıyorum ve en zahmetli dosyalar hariç hepsini yakalayacağım (çözülebilir bir pep8 ihlali bulamadığında geçmeyi durdurur) ...

Bu noktada yeniden test etmenizi ve bir taahhütte bulunmanızı öneririm!

"Tam" PEP8 uyumluluğu istiyorsanız : Kullandığım taktiklerden biri, autopep8'i yukarıdaki gibi çalıştırmak, ardından kalan ihlalleri (dosya, satır numarası ve ne) yazdıran PEP8'i çalıştırmaktır:

pep8 project_dir --ignore=E501

ve bunları ayrı ayrı manuel olarak değiştirin (örn. E712s - boole ile karşılaştırma).

Not: autopep8 bir --aggressiveargüman sunar (bu anlam değiştiren ihlalleri acımasızca "düzeltmek" için), ancak agresif kullanırsanız, hata ayıklamanız gerekebilir ... (örn. Numpy / pandalarda True == np.bool_(True)ama değil True is np.bool_(True)!)

Her türden kaç ihlal olduğunu kontrol edebilirsiniz (önce ve sonra):

pep8 --quiet --statistics .

Not: E501'lerin (satır çok uzun) özel bir durum olduğunu düşünüyorum çünkü kodunuzda bunlardan birçoğu olacaktır ve bazen bunlar autopep8 tarafından düzeltilmez.

Örnek olarak, bu tekniği pandaların kod tabanına uyguladım .


@hayden Bunun ne kadar güvenilir olduğu ve otomotik düzeltmelerin ortaya çıkardığı garip sorunlara oranı hakkında herhangi bir yorumunuz var mı?
Marius

@Marius Bunu pandalar kodunda kullandım (oldukça büyük) ve herhangi bir tuhaf sorun göstermedi, anlamı değiştiren kodu değiştirmeyecek , cevabımı bunlardan bahsetmek için güncelledim. Daha önce Sphinx'in hashbang'ıyla ilgili bir sorun vardı (PEP8'deki bir hata şimdi düzeltildi).
Andy Hayden

2
Bu, yorumlarda Strunk ve White'ı zorunlu kılıyor mu?
Eric

1
25 Ekim 2017 itibarıyla, pep8bu yanıtta bahsedilen paket şu şekilde yeniden adlandırılmıştır pycodestyle: github.com/PyCQA/pycodestyle/releases/tag/1.7.1
hb20007

8

@Andy Hayden, autopep8 hakkında iyi bir genel bakış verdi. Buna ek olarak pep8ify adında aynı şeyi yapan bir paket daha var .

Ancak her iki paket de yalnızca tüy bırakma hatalarını kaldırabilir ancak kodu biçimlendiremezler.

little = more[3:   5]

Yukarıdaki kod pep8ifikasyondan sonra da aynı kalır. Ancak kod henüz iyi görünmüyor. Kod PEP8 uyumlu olsa bile kodu biçimlendirecek yapf gibi biçimlendiricileri kullanabilirsiniz . Yukarıdaki kod şu şekilde biçimlendirilecek:

little = more[3:5]

Bazen bu, manuel biçimlendirmenizi bile yok eder. Örneğin

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

dönüştürülecek

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

Ama ona bazı kısımları görmezden gelmesini söyleyebilirsiniz.

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

Eski blog yazımdan alınmıştır : Otomatik Olarak PEP8 & Python Kodunuzu Biçimlendirin!


2
little = more[3: 5]Pep8'deki (kütüphane) bir hata mı ? yapf kesinlikle buradaki gelecek, arkasındaki algoritma (esasen tüm biçimlendirme seçeneklerinin grafiğindeki en kısa yol) çok zarif bir çözümdür ve muhtemelen daha az hataya ve kanonik biçimlendirmeye sahip olacaktır.
Andy Hayden

@AndyHayden Eksik bir özellik gibi görünüyor, E225
ChillarAnand

5

Eclipse + PyDev kullanıyorsanız, autopep8'i PyDev'in ayarlarından etkinleştirebilirsiniz: Windows -> Tercihler -> arama filtresine 'autopep8' yazın.

'Kod biçimlendirmesi için autopep8.py kullanılsın mı?' -> Tamam

Şimdi eclipse'in CTRL-SHIFT-F kod biçimlendirmesi, kodunuzu autopep8 kullanarak biçimlendirmelidir :)

ekran görüntüsü


3

Python ve kod stili için farklı araçlar hakkında geniş araştırmalar yaptım. İki tür araç vardır: linterler - kodunuzu analiz etmek ve kötü kullanılan kod stilleri hakkında bazı uyarılar vermek ve nasıl düzeltileceğini gösteren öneriler ve kod biçimlendiriciler - dosyanızı kaydettiğinizde, belgenizi PEP stilini kullanarak yeniden biçimlendirmek.

Yeniden biçimlendirmenin daha doğru olması gerektiğinden - istemediğiniz bir şeyi yeniden biçimlendirirse, işe yaramaz hale gelirse - PEP'in daha az kısmını kaplarlar, linterler çok daha fazlasını gösterir.

Hepsinin yapılandırma için farklı izinleri vardır - örneğin, tüm kurallarında yapılandırılabilen pylinter (her türden uyarıyı açıp kapatabilirsiniz), hiç yapılandırılamayan siyah.

İşte bazı yararlı bağlantılar ve öğreticiler:

Belgeler:

Linters (popülerlik sırasına göre):

Kod biçimlendiricileri (popülerlik sırasına göre):


1

Çok var.

IDE'lerde genellikle bazı biçimlendirme yetenekleri bulunur. IntelliJ Idea / PyCharm yapar, aynısı Eclipse için Python eklentisi için de geçerlidir, vb.

Birden çok dili hedefleyebilen biçimlendiriciler / linterler vardır. https://coala.io bunlara güzel bir örnek.

Sonra, diğer cevaplarda birçoğundan söz edilen tek amaçlı araçlar var.

Otomatik yeniden biçimlendirmenin belirli bir yöntemi, dosyayı AST ağacına ayrıştırmak (yorumları düşürmeden) ve ardından metne geri dökmektir (orijinal biçimlendirmeden hiçbir şey korunmaz). Bunun örneği https://github.com/python/black olacaktır .

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.