Ik weet dat er tools zijn die valideren of je Python-code compatibel is met PEP8, er is bijvoorbeeld zowel een online serviceals een python-module.
Ik kan echter geen service of module vinden die mijn Python-bestand kan converterennaar een op zichzelf staand, PEP8-geldig Python-bestand. Weet iemand of die er zijn?
Ik neem aan dat het haalbaar is, aangezien PEP8 draait om het uiterlijk van de code, toch?
Antwoord 1, autoriteit 100%
Je kunt autopep8gebruiken! Terwijl je een kopje koffie zet, verwijdert deze tool met plezier al die vervelende PEP8-overtredingen die de betekenisvan de code niet veranderen.
Installeer het via pip:
pip install autopep8
Pas dit toe op een specifiek bestand:
autopep8 py_file --in-place
of naar uw project (recursief), de uitgebreide optie geeft u feedback over hoe het gaat:
autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose
Opmerking: soms is de standaardwaarde van 100 passen niet genoeg, ik stel het in op 2000 omdat het redelijk hoog is en alle bestanden behalve de meest lastige bestanden zal opvangen (het stopt met passeren zodra het geen oplosbare pep8-overtredingen vindt). ..
Op dit punt raad ik aan om opnieuw te testen en een commit te doen!
Als u “volledige”PEP8-compliance wilt: een tactiek die ik heb gebruikt, is om autopep8 uit te voeren zoals hierboven, en vervolgens PEP8 uit te voeren, die de resterende overtredingen afdrukt (bestand, regelnummer, en wat) :
pep8 project_dir --ignore=E501
en wijzig deze handmatig afzonderlijk (bijv. E712s – vergelijking met boolean).
Opmerking: autopep8 biedt een --aggressive
-argument (om deze betekenisveranderende schendingen meedogenloos te “repareren”), maar pas op als je agressief gebruikt, moet je misschien debuggen… (bijv. in numpy/panda’s True == np.bool_(True)
maar niet True is np.bool_(True)
!)
U kunt controleren hoeveel schendingen van elk type (voor en na):
pep8 --quiet --statistics .
Opmerking: ik beschouw E501’s (te lange regel) als een speciaal geval, aangezien er waarschijnlijk veel van deze in uw code zullen voorkomen en deze soms niet worden gecorrigeerd door autopep8.
Als voorbeeld heb ik deze-techniek toegepast op de panda’scodebasis.
Antwoord 2, autoriteit 20%
Helaas heeft “pep8 storming” (het hele project) verschillende negatieve bijwerkingen:
- veel merge-conflicten
- breek de schuld
- code review moeilijk maken
Als alternatief (en dankzij @yp voor het idee), schreef ik een klein pakketje dat alleen die regels autopep8 waar je aan hebt gewerkt sinds de laatste commit/branch:
Eigenlijk het project een beetje verlatenbeter dan je het vond:
pip install pep8radius
Stel dat je je werk van master
hebt gedaan en klaar bent om je te committeren:
# 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
Of om de nieuwe regels die je hebt vastgelegd sinds de laatste vastlegging op te schonen:
pep8radius --diff
pep8radius --diff --in-place
# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff
In principe pep8radius
past autopep8 toe op regels in de uitvoer van git/hg diff (van de laatste gedeelde commit).
Dit script werkt momenteel met git en hg, als je iets anders gebruikt en wilt dat dit werkt alstublieft plaats een opmerking/probleem/PR!
Antwoord 3, autoriteit 4%
@Andy Hayden gaf een goed overzicht van autopep8. Daarnaast is er nog een pakket genaamd pep8ifydat ook hetzelfde doet.
Beide pakketten kunnen echter alleen lintfouten verwijderen, maar ze kunnen de code niet formatteren.
little = more[3: 5]
Bovenstaande code blijft hetzelfde na pep8ificatie. Maar de code ziet er nog niet goed uit. Je kunt formatters gebruiken zoals yapf, die de code formatteren, zelfs als de code PEP8-compatibel is.
Bovenstaande code wordt opgemaakt als
little = more[3:5]
Soms vernietigt dit zelfs Uw handmatige opmaak. Bijvoorbeeld
BAZ = {
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
}
wordt geconverteerd naar
BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}
Maar je kunt het vertellen om sommige delen te negeren.
BAZ = {
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
} # yapf: disable
Genomen uit mijn oude blogpost: Automatisch PEP8 & ; Formatteer uw Python-code!
Antwoord 4, autoriteit 3%
Ik heb uitgebreid onderzoek gedaan naar verschillende instrumenten voor python en codestijl.
Er zijn twee soorten instrumenten: linters – analyseren van uw code en geven enkele waarschuwingen over slecht gebruikte codestijlen en geven advies over hoe u dit kunt oplossen, en codeformatters – wanneer u uw bestand opslaat, formatteert het uw document opnieuw in PEP-stijl.
Omdat opnieuw formatteren nauwkeuriger moet zijn – als het iets opnieuw formatteert dat je niet wilt, wordt het nutteloos – ze dekken minder deel van PEP, linters laten veel meer zien.
Ze hebben allemaal verschillende machtigingen voor configuratie – bijvoorbeeld pylinter configureerbaar in al zijn regels (u kunt elk type waarschuwing in- of uitschakelen), zwart helemaal niet configureerbaar.
Hier zijn enkele nuttige links en tutorials:
Documentatie:
- PEP-257 Docstring-conventies:
https://www.python.org/dev/peps/pep-0257/ - PEP-484 Type Hint: https://www.python.org/dev /peps/pep-0484
- Chroom-stijlgids
https://chromium.googlesource.com/chromiumos/docs/ +/master/styleguide/python.md - Codestijl voor autotest
https://chromium.googlesource.com/ chromiumos/third_party/autotest/+/master/docs/coding-style.md - Khan Academy Codeerstijlgids
https://github.com/Khan/style-guides/ blob/master/style/python.md - De liftersgids voor Python https://docs.python-guide.org/
- EdX Python-stijlgids
https://edx.readthedocs. io/projects/edx-developer-guide/en/latest/style_guides/python-guidelines.html - Artikel in codestijl op RealPython https://realpython.com/python-pep8/
Linters(in volgorde van populariteit):
- mypy https://github.com/python/mypylinter voor typecontrole
(PEP-484) - pycodestyle https://github.com/PyCQA/pycodestyle– een goede met
PEP-8, erg populair. Vaak gebruikt naast pylint en flake8 (gelijktijdig) - pylint https://github.com/PyCQA/pylintzeer configureerbaar, actief ondersteund
- bandit https://github.com/PyCQA/banditveiligheidscontroles
- prospector https://github.com/PyCQA/prospectorpylint+code moeilijkheidsgraad
- flake8 https://github.com/PyCQA/flake8pycodestyle-wrapper met mogelijkheid om in te schakelen plug-ins. Zeer grote lijst met verschillende configureerbare plug-ins. Hier is een geweldige flake8-repo:
https://github.com/DmytroLitvinov/awesome-flake8-extensions - wemake https://github.com/wemake-services/wemake-python- stijlgids–
proberen veel verschillende linters in één project te combineren (het is eigenlijk een flake8-plug-in die stijlen van verschillende andere linters combineert) - pylama https://github.com/klen/pylamaprobeert 10 andere linters te combineren in één (mypy, pylint, pycodestyle, pydocstyle, enz.). Ik zie hier het enige probleem: oude versie (ongeveer 10 maanden geen updates in github repo.)
- pydocstyle https://github.com/PyCQA/pydocstyledocstrings linter
(PEP-257)
Codeformatters (in volgorde van populariteit):
- zwarte https://github.com/psf/blackmeest populaire formatter, gebruikt in verschillende grote bedrijven. Is later gemaakt dan yapf, maar heeft al meer starts op GitHub
- yapf https://github.com/google/yapfGoogle-codeformatter
- autopep8 https://github.com/hhatto/autopep8bouwt voort op de
pycodestyle
Antwoord 5, autoriteit 2%
Als je eclipse + PyDev gebruikt, kun je autopep8 eenvoudig activeren via de instellingen van PyDev:
Windows -> Voorkeuren -> typ ‘autopep8’ in het zoekfilter.
Controleer ‘autopep8.py gebruiken voor codeopmaak?’ -> OK
Eclipse’s CTRL-SHIFT-F code-opmaak zou je code nu moeten formatteren met autopep8 🙂
Antwoord 6
Er zijn er veel.
IDE’s hebben meestal een ingebouwde formatteringsmogelijkheid. IntelliJ Idea / PyCharm doet dat, hetzelfde geldt voor de Python-plug-in voor Eclipse, enzovoort.
Er zijn formatters/linters die zich op meerdere talen kunnen richten. https://coala.iois daar een goed voorbeeld van.
Dan zijn er de tools voor één doel, waarvan er vele in andere antwoorden worden genoemd.
Eén specifieke methode voor automatische herformattering is het parseren van het bestand in AST-boom (zonder opmerkingen te laten vallen) en vervolgens terug te dumpen naar de tekst (wat betekent dat niets van de originele opmaak wordt bewaard). Voorbeeld van dat zou https://github.com/python/black .