Hulpprogramma om Python-code te converteren naar PEP8-compatibel

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 masterhebt 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 pep8radiuspast 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 &amp ; 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:

Linters(in volgorde van populariteit):

Codeformatters (in volgorde van populariteit):


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 .

Other episodes