[[Vorlage(Getestet, bionic)]]

{{{#!vorlage Wissen
[:Pakete installieren: Installation von Programmen]
[:Terminal: Ein Terminal öffnen]
}}}

[[Inhaltsverzeichnis(1)]]

[[Bild(Wiki/Icons/python.png, 48, align=left)]]
[http://www.python.org/dev/peps/pep-0008/ PEP 8] {en} ist der "Style Guide for Python Code", also die Richtlinie zum Formatieren von [:Python:]-Code, an die sich quasi jeder Python-Programmierer hält.

Das Programm [http://pypi.python.org/pypi/pycodestyle pycodestyle] {en} kann den eigenen Programmcode auf Konformität mit PEP 8 untersuchen und vorhandene Fehler direkt anzeigen. Das Programm hießt früher "pep8", wurde aber [https://github.com/PyCQA/pycodestyle/issues/466 auf Wunsch] {en} des Python-Erfinder Guido van Rossum umbenannt.

= Installation =
Das Programm kann über die Paketquellen installiert werden [1]:

{{{#!vorlage Paketinstallation
pycodestyle
}}}

Dabei wird das Kommandozeilenprogramm als auch das Python-Modul installiert.

== Manuell ==
Wie unter Python üblich, kann man sich die aktuellste Version von pep8 auch mit Hilfe von [:pip:] aus dem [http://pypi.python.org/pypi Python Package Index] {en} installieren. Dabei wird auch sowohl das Kommandozeilenprogramm als auch das Python-Modul installiert:

[[Vorlage(pipinstallation, pep8)]]

= Benutzung =
pycodestyle wird über die Kommandozeile genutzt. Die allgemeine Syntax lautet[2]:

{{{#!vorlage Befehl
pycodestyle OPTION DATEI(EN)
}}}

{{{#!vorlage Tabelle
<-2 rowclass="titel"> Optionen von pep8
+++
<rowclass="kopf">Option
Erklärung
+++
`--show-source`
Zeigt den Quellcode, welcher den Fehler enthält, mit an.
+++
`--show-pep8`
Zeigt den den Fehler betreffenden Abschnitt aus der PEP 8 mit an. (Hinweis: dadurch kann die Ausgabe sehr lang werden)
+++
`--exclude=DATEIEN`
Ignoriert die Datei(en) `DATEIEN` bei der Prüfung. Mehrere Dateien können durch ein Komma `,` getrennt werden, Wildcards und Joker können auch eingesetzt werden (z.B. `*.html`).
+++
`--filename=DATEIEN`
Es werden nur die Datei(en) `DATEIEN` geprüft. Diese Option bewirkt das Gegenteil zu `--exclude`.
+++
`--ignore=FEHLER`
Es werden keine Meldungen zum Fehlertyp `FEHLER` angezeigt. Mehrere Fehlertypen können durch ein Komma `,` getrennt angegeben werden.
+++
`--select=FEHLER`
Es werden nur Fehler vom Fehlertyp `FEHLER` angezeigt. Diese Option ist genau Gegenteil von `--ignore`.
}}}

Der Aufruf von

{{{#!vorlage Befehl
pycodestyle -h
}}}

zeigt aber die vollständige Hilfe an.

== Beispiel ==
Das folgende, kurze (und nicht weiter sinnvolle) Code-Beispiel ist an einigen Stellen nicht PEP-8-konform:

{{{#!code python
import os, datetime

class MyClass(object):
    def __init__(self):
        self.my_dict = {'mykey':'ein Wert'}
        
    def My_method(self):
        if self.my_dict.has_key('mykey'):
            print '''Das Dictionary my_Dict enthält einen Schlüssel mit dem Namen {0}, {1}'''.format(
               self.my_dict['mykey'],'toll, oder?')

        print datetime.datetime.today()

if __name__=='__main__':
    my_class = MyClass()
    my_class.My_method()
}}}

Speichert man die Datei z.B. unter dem Namen '''pep8_test.py''' ab und lässt mit dem Aufruf von

{{{#!vorlage Befehl
pycodestyle pep8_test.py
}}}

den Konformitätstest darüber laufen, erhält man folgende Ausgabe, die die Fehler auslistet:

{{{
pep8_test.py:3:10: E401 multiple imports on one line
pep8_test.py:5:1: E302 expected 2 blank lines, found 1
pep8_test.py:7:36: E231 missing whitespace after ':'
pep8_test.py:8:5: E301 expected 1 blank line, found 0
pep8_test.py:9:24: W601 .has_key() is deprecated, use 'in'
pep8_test.py:10:80: E501 line too long (101 > 79 characters)
pep8_test.py:11:38: E231 missing whitespace after ','
pep8_test.py:14:12: E225 missing whitespace around operator
pep8_test.py:18:1: W293 blank line contains whitespace
pep8_test.py:18:1: W391 blank line at end of file
}}}

Den Fehler Typ "W293" in der Zeile 8 sieht man übrigens im obigen Listing nicht - hier werden überflüssigen Leerzeichen in einer sonst leeren Zeile bemängelt.

Der Aufruf von:

{{{#!vorlage Befehl
pycodestyle pep8_test.py --statistics
}}}
zeigt, zusätzlich zur obigen Ausgabe, noch eine Fehlerstatistik an:

{{{
...
1       E225 missing whitespace around operator
2       E231 missing whitespace after ':'
1       E301 expected 1 blank line, found 0
1       E302 expected 2 blank lines, found 1
1       E305 expected 2 blank lines after class or function definition, found 1
1       E401 multiple imports on one line
1       E501 line too long (101 > 79 characters)
1       W293 blank line contains whitespace
1       W391 blank line at end of file
1       W601 .has_key() is deprecated, use 'in'
}}}

Hier tritt also jeder Fehler nur ein- oder zweimal auf.

Der folgende Befehl weist pep8 an, die Fehler E501 (= Zeile länger als 79 Zeichen) und W292 (Leerzeile enthält Leerzeichen) zu ignorieren. Entsprechend kürzer ist die Liste der Fehler:

{{{#!vorlage Befehl
pycodestyle pep8_test.py --ignore=E501,W292
}}}

{{{
pep8_test.py:3:10: E401 multiple imports on one line
pep8_test.py:5:1: E302 expected 2 blank lines, found 1
pep8_test.py:7:36: E231 missing whitespace after ':'
pep8_test.py:8:5: E301 expected 1 blank line, found 0
pep8_test.py:9:24: W601 .has_key() is deprecated, use 'in'
pep8_test.py:11:38: E231 missing whitespace after ','
pep8_test.py:14:1: E305 expected 2 blank lines after class or function definition, found 1
pep8_test.py:14:12: E225 missing whitespace around operator
pep8_test.py:18:1: W293 blank line contains whitespace
pep8_test.py:18:1: W391 blank line at end of file
}}}

Der folgende Befehl veranlasst pep8 dazu, alle Dateien im Verzeichnis '''trunk''' (und dessen Unterverzeichnissen) zu prüfen, dabei aber alle Dateien mit der Endung '''tmpl''' sowie die Datei '''jsontemplate.py''' zu ignorieren:

{{{#!vorlage Befehl
pycodestyle trunk --exclude=*.tmpl,jsontemplate.py
}}}

= Links =
 * [https://pycodestyle.pycqa.org/en/latest/ Dokumentation] {en} von pycodestyle
 * [github:PyCQA/pycodestyle:Github Seite] von pycodestyle
 * [github:hhatto/autopep8:autopep8] {en} - Python-Programm zur automatisierten Korrektur von nicht PEP8-konformen Python-Code

#tag: Programmierung, Python