Narzędzie do konwersji kodu Pythona na zgodny z PEP8

Wiem, że istnieją narzędzia, które sprawdzają, czy Twój kod w Pythonie jest zgodny z PEP8, na przykład istnieje zarówno Usługa online , jak i moduł Pythona.

Jednak nie mogę znaleźć usługi lub modułu, który możeprzekonwertować mój plik Pythona do samodzielnego, poprawnego pliku Pythona PEP8. Czy ktoś wie, czy są jakieś?
zakładam, że jest to możliwe, ponieważ PEP8 polega na wyglądzie kodu, prawda?

Author: Ioannis Filippidis, 2013-01-15

5 answers

Niestety "burza pep8" (cały projekt) ma kilka negatywnych skutków ubocznych:

  • dużo merge-conflicts
  • break git blame
  • utrudnić przegląd kodu

Jako alternatywę (i dzięki @y-p za pomysł ), napisałem mały pakiet, który autopep8s tylko te linie, nad którymi pracowałeś od ostatniego commit / branch:

zasadniczo pozostawiając projekt trochę lepiej niż znalazłeś it:

pip install pep8radius

Załóżmy, że wykonałeś swoją pracę poza master i jesteś gotowy do popełnienia:

# 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

Lub wyczyścić nowe linie, które dodałeś od ostatniego commita:

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

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

zasadniczo pep8radius stosuje autopep8 do linii na wyjściu git / hg diff (z ostatniego współdzielonego commita).

Ten skrypt obecnie działa z git i hg, jeśli używasz czegoś innego i chcesz, aby to działało dodaj komentarz/problem / PR!

 28
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:34

Możesz użyć autopep8 ! Podczas gdy robisz sobie filiżankę kawy to narzędzie z radością usuwa wszystkie te brzydkie naruszenia PEP8, które nie zmieniają znaczenia kodu.

Zainstaluj go przez pip:

pip install autopep8

Zastosuj to do konkretnego pliku:

autopep8 py_file --in-place

Lub do twojego projektu (rekurencyjnie), opcja verbose daje Ci informacje zwrotne o tym, jak to idzie :

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

Uwaga: czasami domyślna 100 przepustek to za mało, ustawiam ją na 2000, ponieważ jest dość wysoki i złapie wszystkie, ale najbardziej kłopotliwe pliki(przestaje przechodzić, gdy nie znajdzie rozwiązalnych naruszeń pep8)...

W tym momencie proponuję ponownie przetestować i zrobić commit!

Jeśli chcesz "full" zgodność z PEP8: jedną taktyką, której użyłem, jest uruchomienie autopep8 jak powyżej, a następnie uruchomienie PEP8, które wyświetla Pozostałe naruszenia (plik, numer linii i CO):

pep8 project_dir --ignore=E501

I ręcznie je zmieniać indywidualnie (np. e712s-porównanie z boolean).

Uwaga: autopep8 oferuje argument --aggressive (aby bezwzględnie "naprawić" te naruszenia zmieniające znaczenie), ale uważaj, jeśli używasz agresywnych, być może będziesz musiał debugować... (np. w numpy / pandy True == np.bool_(True) ale nie True is np.bool_(True)!)

Możesz sprawdzić, ile naruszeń każdego typu (przed i po):

pep8 --quiet --statistics .

Uwaga: uważam, że E501s (linia zbyt długa) są szczególnym przypadkiem, ponieważ prawdopodobnie będzie ich dużo w Twoim kodzie i czasami nie są one poprawiane przez autopep8.

jako przykład zastosowałem tę technikę do bazy kodu pandas .

 150
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 00:21:42

@ Andy Hayden dał dobry przegląd autopep8. Oprócz tego istnieje jeszcze jeden pakiet o nazwie pep8ify , który również robi to samo.

Jednak oba pakiety mogą usuwać tylko błędy lint, ale nie mogą sformatować kodu.

little = more[3:   5]

Powyższy kod pozostaje taki sam po pep8. Ale kod nie wygląda jeszcze dobrze. Możesz użyć formaterów takich jak yapf , które sformatują Kod, nawet jeśli kod jest zgodny z PEP8. Powyższy kod zostanie sformatowany na

little = more[3:5]

Czasami to nawet niszczy ręczne formatowanie. Na przykład

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

Zostanie zamienione na

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

Ale można powiedzieć, aby zignorować niektóre części.

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

Zaczerpnięte z mojego starego posta na blogu: automatycznie PEP8 & sformatuj swój kod Pythona!

 6
Author: ChillarAnand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-21 06:48:43

Jeśli używasz eclipse + PyDev, możesz po prostu aktywować autopep8 z poziomu ustawień PyDev: Windows - > Preferencje - > wpisz 'autopep8' w filtrze wyszukiwania.

Sprawdź " użycie autopep8.py do formatowania kodu?'- >OK

Teraz formatowanie kodu Ctrl-SHIFT-F eclipse powinno formatować kod używając autopep8:)

screen shot

 3
Author: mork,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-05 10:24:26

Jest ich wiele.

IDE zwykle mają wbudowaną funkcję formatowania. IntelliJ Idea / PyCharm robi, to samo dotyczy wtyczki Pythona do Eclipse, i tak dalej.

Istnieją formatery / lintery, które mogą być adresowane do wielu języków. https://coala.io jest tego dobrym przykładem.

Następnie są narzędzia do jednego celu, z których wiele jest wymienionych w innych odpowiedziach.

 0
Author: user7610,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-21 11:11:28