Ich denke, die einzige Regel, die Pythonista befolgen muss, sind die PEP8-Codierungsstandards. Wenn Sie ein Anfänger sind, sollten Sie ein Plug-In installieren, das PEP8 in Ihrem Editor überprüft, bevor Sie eine besonders seltsame Angewohnheit bekommen. Es gibt eine klare Korrelation zwischen Code mit vielen PEP8-Verstößen und Code mit vielen Fehlern und Problemen. In diesem Eintrag stellen wir vor, wie Sie einen Code oder ein Bestätigungstool einführen, das dem PEP8-Standard, dem PEP8-Standard-Konformitätsverhältnis berühmter Bibliotheken und dem PEP8-Tool für jeden Editor entspricht.
In Python PEP20 - Das Zen von Python (japanische Übersetzung )) Stellt die folgenden Einstellungen fest.
Leicht zu lesen ist gut. Besonderes zu sein ist kein Grund, gegen die Regeln zu verstoßen. Bei der Suche nach Praktikabilität kann jedoch die Natürlichkeit verloren gehen.
Sie müssen sich nicht zwingen, auf null PEP8-Verstöße zu zielen, aber ich möchte, dass Sie einheitlichen, einfach zu lesenden Code schreiben, der so weit wie möglich PEP8 entspricht. Ich habe versucht, das Ausmaß der Verstöße im Verstoßstatus der oberen PyPi-Rangbibliothek unten aufzulisten. Vielen Dank.
Mit flake8 können Sie den PEP8-Konformitätsstatus einfach überprüfen.
install
pip install flake8
flake8 {project_root} --filename=*.py --exclude=commands,migrations,[^_]*.py --max-line-length=79
Ausführungsergebnis
xxxxxx.py:20:1: E101 indentation contains mixed spaces and tabs
xxxxxx.py:20:1: W191 indentation contains tabs
xxxxxx.py:20:9: E223 tab before operator
xxxxxx.py:20:14: E261 at least two spaces before inline comment
xxxxxx.py:21:1: W191 indentation contains tabs
xxxxxx.py:21:8: E223 tab before operator
xxxxxx.py:21:13: E261 at least two spaces before inline comment
xxxxxx.py:22:1: W191 indentation contains tabs
xxxxxx.py:22:10: E223 tab before operator
xxxxxx.py:22:14: E261 at least two spaces before inline comment
xxxxxx.py:23:1: W191 indentation contains tabs
xxxxxx.py:23:9: E223 tab before operator
#Schrecklich, wenn Sie auf Code stoßen, der Zeile für Zeile gegen PEP8 verstößt
Ich habe untersucht, wie angemessen eine PEP8-Verletzung für die 50 besten Projekte ist, indem ich sie in PyPi Ranking heruntergeladen habe. Eine PEP8-Verletzung mit einem Durchschnitt von 0,1 oder weniger pro Zeile wäre ein ausgezeichnetes Projekt. Die Erfahrung zeigt, dass Python-Anfänger, die sich der Existenz von PEP8 nicht bewusst sind, häufig Code schreiben, der 0,3 pro Zeile überschreitet.
Bestätigungscode für den PEP8-Verstoßstatus
# -*- coding:utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os
import commands
pypi_ranking = [
'simplejson',
'setuptools',
'requests',
'distribute',
'virtualenv',
'six',
'pip',
'certifi',
'boto',
'wincertstore',
'pbr',
'python-dateutil',
'nose',
'Jinja2',
'lxml',
'docutils',
'MarkupSafe',
'pyasn1',
'pytz',
'PyYAML',
'pycrypto',
'pika',
'rsa',
'coverage',
'colorama',
'Django',
'psycopg2',
'botocore',
'cffi',
'awscli',
'paramiko',
'jmespath',
'pycparser',
'SQLAlchemy',
'ecdsa',
'redis',
'selenium',
'bcdoc',
'supervisor',
'Werkzeug',
'mock',
'zc.buildout',
'httplib2',
'Paste',
'Flask',
'pep8',
'pymongo',
'carbon',
'ssl',
'meld3',
]
def get_py_file_line_count(_dir):
_cmd_base = 'find {} -name \*.py|xargs wc -l'
cmd = _cmd_base.format(_dir)
result = commands.getoutput(cmd)
return int(result.split('\n')[-1].replace(' total', ''))
def get_flake8_warning(_dir):
cmd_base = 'flake8 {} --filename=*.py --exclude=commands,migrations,[^_]*.py ' \
'--max-line-length=79|wc -l'
cmd = cmd_base.format(_dir)
return int(commands.getoutput(cmd))
# pip install
for app_name in pypi_ranking:
os.system('pip install {}'.format(app_name))
#Untersuchung der PEP8-Verletzungssituation
for app_name in pypi_ranking:
_path_base = '~/.virtualenvs/test1/lib/python2.7/site-packages/{}/'
path = _path_base.format(app_name)
#PEP8-Verletzung bei flake8
try:
flake8_warning = get_flake8_warning(path)
#Zählen Sie die Gesamtzahl der Zeilen in der py-Datei
lines = get_py_file_line_count(path)
per_line = float(flake8_warning) / float(lines)
print 'APP:{} TotalLine:{} PEP8-warning:{} ' \
'PEP8-warning-each-line:{}'.\
format(app_name, lines, flake8_warning, per_line)
except Exception:
print "ERROR directory does not exist:{}".format(app_name)
Ausführungsergebnis
>>> python check.py
APP:simplejson TotalLine:4041 PEP8-warning:176 PEP8-warning-each-line:0.0435535758476
APP:setuptools TotalLine:9004 PEP8-warning:496 PEP8-warning-each-line:0.0550866281653
APP:requests TotalLine:17168 PEP8-warning:3218 PEP8-warning-each-line:0.187441752097
ERROR directory does not exist:distribute
APP:Jinja2 TotalLine:10806 PEP8-warning:93 PEP8-warning-each-line:0.00860632981677
APP:lxml TotalLine:6533 PEP8-warning:354 PEP8-warning-each-line:0.0541864380836
APP:docutils TotalLine:39915 PEP8-warning:6685 PEP8-warning-each-line:0.167480896906
APP:MarkupSafe TotalLine:816 PEP8-warning:8 PEP8-warning-each-line:0.00980392156863
....
--PyCharm: Es wird standardmäßig installiert. --vim: Python-Codierungsstil mit vim automatisch überprüfen und korrigieren --Emacs: Überprüfen Sie immer PEP8, während Sie den Python-Quellcode in Emacs bearbeiten --Ecrips: Kompatibel mit # PEP8, das eine Python-Entwicklungsumgebung mit Eclipse (luna) und Pydev erstellt
Boomerang Ich habe Angst, also habe ich den PEP8-Verstoßstatus des von mir veröffentlichten Moduls überprüft. Wenn Sie das PEP8-Check-Plug-In ordnungsgemäß installieren und den Code bewusst schreiben, werden Sie wahrscheinlich nicht so sehr gegen PEP8 verstoßen.
PEP 0008 -- Style Guide for Python Code PEP 20 -- The Zen of Python Das Zen von Python PyPI Ranking