Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить — идея плоха.
Если реализацию легко объяснить — идея, возможно, хороша.
Пространства имен — отличная штука! Будем делать их побольше!
Для того чтобы увидеть пример использования каждого из этих афоризмов, обратитесь к презентации Хантера Блэнкса (Hunter Blanks) PEP 20 (The Zen of Python) by Example ( http://artifex.org/~hblanks/talks/2011/pep20_by_example.pdf). Рэймонд Хеттингер (Raymond Hettinger) также демонстрирует применение этих принципов в своей речи Beyond PEP 8: Best Practices for Beautiful, Intelligible Code ( http://bit.ly/beyond-pep-8).
В этом разделе приводятся концепции, связанные со стилем (надеемся, вы с ними согласитесь). Зачастую они применимы и к другим языкам. Некоторые следуют непосредственно из «Дзена Питона», другие основаны на здравом смысле. Они подтверждают наш принцип работы: при написании кода Python выбирать наиболее очевидный способ его представления из имеющихся вариантов.
Явное лучше, чем неявное
В Python предпочтителен наиболее явный способ выражения:
Плохой код |
Хороший код |
def make_dict(*args): |
def make_dict(x, y): |
····x, y = args |
····return {'x': x, 'y': y} |
····return dict(**locals()) |
|
В примере хорошего кода x и y явно принимаются от вызывающей стороны, явно возвращается словарь. Возьмите на вооружение полезное правило: другой разработчик должен понять, что делает функция, прочитав ее первую и последнюю строки. В примере плохого кода это правило не выполняется. (Конечно, функцию довольно просто понять, если она состоит всего из двух строк.)
Разреженное лучше, чем плотное
В каждой строке размещайте только одно выражение. Использование сложных выражений (вроде абстракция списков (иначе называют списковыми включениями — list comprehensions)) позволяется и даже поощряется за их краткость и выразительность, но признаком хорошего тона будет размещение отдельных выражений на разных строках. Это поможет создавать более простые для понимания разности [37] Разность — это утилита оболочки, которая сравнивает два файла и показывает отличающиеся строки.
, когда подобное выражение изменяется:
Плохой код |
Хороший код |
print('one'); print('two') |
print('one') |
|
print('two') |
if x == 1: print('one') |
if x == 1: |
|
····print('one') |
if ( and |
cond1 = |
····): |
cond2 = |
····# сделать что-нибудь |
if cond1 and cond2: |
|
····# сделать что-нибудь |
Повышение читаемости кода среди питонистов ценится гораздо выше, чем увеличение объема на несколько байт (в случае двух-выражений-print-в-одной-строке) или увеличение времени вычисления на несколько миллисекунд (в случае нескольких-условий-в-отдельных-строках). Кроме того, когда группа разработчиков вносит изменения в открытый код, историю изменений хорошего кода проще расшифровать, поскольку изменение в одной строке может воздействовать только на одно выражение.
Ошибки никогда не должны замалчиваться/Если не замалчиваются явно
Обработка ошибок в Python выполняется с помощью выражения try. Пример из пакета HowDoI (более подробно описывается в разделе «HowDoI» в главе 5) Бена Глейтсмана (Ben Gleitzman) показывает, когда замалчивать ошибки приемлемо:
def format_output(code, args):
····if not args['color']:
········return code
····lexer = None
····# попробуем отыскать лексеры с помощью тегов Stack Overflow
····# или аргументов query
····for keyword in args['query'].split() + args['tags']:
········try:
············lexer = get_lexer_by_name(keyword)
············break
········except ClassNotFound:
············pass
····# лексер не найден, пробуем угадать
····if not lexer:
········lexer = guess_lexer(code)
····return highlight(code,
····················lexer,
····················TerminalFormatter(bg='dark'))
Перед вами часть пакета, который предоставляет сценарий командной строки, позволяющий найти в Интернете (по умолчанию на сайте Stack Overflow) способ выполнить задачу по программированию. Функция format_output() подсвечивает синтаксис, просматривая теги вопроса на предмет строки, которую смог разобрать лексер (также он называется токенайзером ; теги python, java или bash позволят определить лексер, который нужно использовать для разбиения и подсвечивания кода), а затем, если он даст сбой, пробует определить язык по самому коду. Когда программа достигает оператора try, она может пойти по одному из трех путей:
Читать дальше