Введение в стиль программирования Python

Python как язык сценариев довольно прост и компактен. По сравнению с другими языками у вас есть относительно небольшое количество ключевых слов, которые нужно усвоить, чтобы написать правильный код Python. Кроме того, предпочтительны как простота, так и удобочитаемость кода, чем и гордится Python. Для достижения обеих целей полезно следовать конкретным правилам языка. В этой статье основное внимание уделяется упомянутым выше рекомендациям по написанию действительного кода, представляющего

Python как язык сценариев довольно прост и компактен. По сравнению с другими языками у вас есть относительно небольшое количество ключевых слов, которые нужно усвоить, чтобы написать правильный код Python. Кроме того, предпочтительны как простота, так и удобочитаемость кода, чем и гордится Python. Для достижения обеих целей полезно следовать конкретным правилам языка.

В этой статье основное внимание уделяется упомянутым выше рекомендациям по написанию правильного кода, представляющего более питонический способ программирования. Это подборка руководств, ориентированных на практическое использование, а дальнейшие рекомендации можно прочитать в «Автостопом» по Python{.amazon-link} и « Руководстве по стилю PEP8» .

Тим Питерс - американский разработчик Python - юмористически сочетает принципы языка с дзеном Python. Эти правила включают основные цели и стиль языка. Надеюсь, эти правила помогут вам сориентироваться как разработчик.

Дзен Python

 Beautiful is better than ugly. 
 Explicit is better than implicit. 
 Simple is better than complex. 
 Complex is better than complicated. 
 Flat is better than nested. 
 Sparse is better than dense. 
 Readability counts. 
 Special cases aren't special enough to break the rules. 
 Although practicality beats purity. 
 Errors should never pass silently. 
 Unless explicitly silenced. 
 In the face of ambiguity, refuse the temptation to guess. 
 There should be one-- and preferably only one --obvious way to do it. 
 Although that way may not be obvious at first unless you're Dutch. 
 Now is better than never. 
 Although never is often better than right now. 
 If the implementation is hard to explain, it's a bad idea. 
 If the implementation is easy to explain, it may be a good idea. 
 Namespaces are one honking great idea -- let's do more of those! 
 --Tim Peters 

Общие рекомендации по программированию

Следуя дзену Python, важна удобочитаемость кода. Чтобы обеспечить правильно отформатированный код, в языке Python есть некоторые рекомендации по программированию, изложенные в PEP8 - например, согласованный отступ, определенная длина строки, запись только одного оператора на строку и формулирование фрагментов кода скорее явным, чем неявным способом. Ниже мы объясним эти правила шаг за шагом.

Отступ

Отступы необходимы для классов, функций (или методов), циклов, условий и списков. Вы можете использовать табуляторы или пробелы, но вы не должны комбинировать их оба в одном скрипте. Для Python 3 пробелы являются предпочтительным методом отступа, а точнее, желательно четыре пробела. Например, список рекомендуется определять одним из следующих двух способов:

Написание списков

 # version 1 
 numbers = [ 
 1, 2, 3, 
 4, 5, 6 
 ] 
 
 # version 2 
 numbers = [ 
 1, 2, 3, 
 4, 5, 6 
 ] 

Как указано в PEP8, закрывающая скобка может быть либо выровнена под первым непробельным символом последней строки списка, как в «версии 1», либо под первым символом строки, которая начинает список как в «версии 2».

Использование пробелов требует, чтобы мы работали с одинаковым количеством пробелов на каждый уровень отступа. В следующем примере показано, как не писать код, в котором используются табуляторы и разное количество пробелов в каждой строке.

Плохой пример

 def draw_point(x, y): 
 """draws a point at position x,y""" 
 
 if (x > 0): 
 set_point(x, y) 
 return 

Для правильного отступа блоков кода в следующем примере используются четыре пробела на каждый уровень отступа, следовательно:

Хороший пример

 def draw_point(x, y): 
 """draws a point at position x,y""" 
 
 if (x > 0): 
 set_point(x, y) 
 return 

Одно заявление в строке

В приведенном выше примере следует еще одно важное правило написания кода: используйте только один оператор в строке. Хотя язык Python позволяет писать несколько операторов в каждой строке, разделенных точкой с запятой, как показано ниже:

Плохо

 print ("Berlin"); print ("Cape Town") 
 
 if x == 1: print ("Amsterdam") 

Вместо этого для большей ясности напишите такой код:

Хорошо

 print ("Berlin") 
 print ("Cape Town") 
 
 if x == 1: 
 print ("Amsterdam") 

Это также относится к использованию модулей Python. Многие примеры программирования показывают два или более модулей, которые импортируются в одной строке следующим образом:

Плохая практика

 import sys, os 

Вместо этого гораздо лучше импортировать по одному модулю на строку:

Хорошая практика

 import sys 
 import os 

Поместите import в начало файла после информации об авторских правах и строк документации. Кроме того, import обычно группируются в стандартные модули из библиотеки Python, связанные сторонние модули и, наконец, импорт для конкретной библиотеки. Вставка пустой строки, а также комментариев улучшает читаемость и лучшее понимание кода.

Импорт внешних модулей

 # use operating-system specific routines 
 import os 
 
 # use regular expressions routines 
 import re 
 
 # use SAX XML library/parser 
 from xml.sax import make_parser, handler 
 ... 

Длина линии

Одна строка не должна превышать 79 символов, тогда как длина строки документа или комментария не должна превышать 72 символа. Строки кода можно обернуть с помощью обратной косой черты ( \ ) следующим образом:

Код с разрывом строки

 with open('/path/to/some/file/you/want/to/read') as file_1, \ 
 open('/path/to/some/file/being/written', 'w') as file_2: 
 file_2.write(file_1.read()) 

Явный и неявный код

Python как язык сценариев достаточно гибок, чтобы вы могли использовать «трюки» во всем коде. Хотя следует учитывать, что много раз ваш код читают другие разработчики. Чтобы улучшить читаемость, лучше писать явный код, а не делать неявные предположения, такие как использование однострочных строк или «уловок».

В приведенном ниже примере функция calculation() скрывает два значения x и y в одном параметре с именем args . Этот способ написания также позволяет вызывающим абонентам при желании передавать функции больше или меньше этих значений, но на первый взгляд это неочевидно.

Плохо

 def calculation(*args): 
 """calculation of the total""" 
 
 x, y = args 
 return (x+y) 
 
 print(calculation(3, 4)) 

Для большей ясности рекомендуется вместо этого написать так:

Хорошо

 def calculation(x,y): 
 """calculation of the total""" 
 
 total = x + y 
 return (total) 
 
 print(calculation(3, 4)) 

Соглашения об именах

Существует довольно много вариантов имен модулей, классов, методов / функций и переменных. Это включает использование строчных и прописных букв с подчеркиванием или без них, прописные слова и смешанные стили. Из-за огромного разнообразия разработчиков вы найдете все эти стили, и между модулями нет согласованности.

Варианты именования стилей

 shoppingcart = [] # lowercase 
 shopping_cart = [] # lowercase with underscores 
 SHOPPINGCART = [] # uppercase 
 SHOPPING_CART = [] # uppercase with underscores 
 ShoppingCart = [] # capitalized words 
 shoppingCart = [] # mixed style 

Какой из стилей использовать - решать вам. Опять же, будьте последовательны и используйте один и тот же стиль во всем коде. Согласно PEP8, применяются следующие основные правила:

  • Имена идентификаторов должны быть совместимы с ASCII.
  • Модули должны иметь короткие имена в нижнем регистре.
  • Классы следуют соглашению о прописных словах
  • Исключения следуют соглашению о прописных словах и, как ожидается, будут иметь Error если они относятся к ошибкам.
  • Константы пишутся прописными буквами

Для получения дополнительных сведений ознакомьтесь со стандартом PEP8.

Мы также должны отметить, что использование подхода «нижний регистр с подчеркиванием» при именовании переменных в Python считается более «питоническим», хотя любой подход разрешен.

Проверка стиля кода

Рекомендации отлично подходят для создания кода, который следует определенным условиям. Как программист, вы должны быть уверены, что следуете им в максимально возможной степени. Автоматизированные инструменты отлично подходят для проверки вашего кода.

Как упоминалось выше, рекомендации описаны в PEP8. Следовательно, язык Python содержит соответствующий инструмент командной строки, который поможет вам проверить ваш код на соответствие рекомендациям. Первоначально известная как pep8 , эта программа проверки кода была переименована в pycodestyle в 2016 году. Она поддерживается Управлением контроля качества кода Python и принадлежит к ряду инструментов, таких как анализаторы исходного кода pylint и pyflakes , средство проверки сложности mccabe, а также docstring. шашечный пидокстиль .

pycodestyle анализирует ваш код Python и сообщает о нарушениях, касающихся ошибок отступов, ненужных пустых строк и использования табуляторов вместо пробелов. В следующем примере содержится образец выходных данных с некоторыми типичными ошибками и предупреждениями:

 $ pycodestyle --first stack.py 
 stack.py:3:1: E265 block comment should start with '# ' 
 stack.py:12:1: E302 expected 2 blank lines, found 1 
 stack.py:13:1: W191 indentation contains tabs 

В Debian GNU / Linux инструмент доступен в виде пакетов python-pycodestyle (для Python 2.x) и python3-pycodestyle (для Python 3.x). Оба они имеют ряд полезных параметров, например:

  • --first : показать первое появление каждой ошибки (как показано выше). В выходных данных отображается файл, в котором была обнаружена ошибка, а также номер строки и столбец.
  • --show-source : показывать исходный код для каждой ошибки
1
<!-- -->
 $ pycodestyle --show-source stack.py 
 stack.py:3:1: E265 block comment should start with '# ' 
 #o 
 ^ 
 stack.py:12:1: E302 expected 2 blank lines, found 1 
 class Stack: 
 ^ 
 stack.py:13:1: W191 indentation contains tabs 
 def __init__(self): 
 ^ 
 ... 
  • --statistics : подсчет ошибок и предупреждений. В следующем примере pycodestyle обнаружил две ошибки - E265 и E302, а также 30 предупреждений (W191).
1
<!-- -->
 $ pycodestyle --statistics stack.py 
 ... 
 1 E265 block comment should start with '# ' 
 1 E302 expected 2 blank lines, found 1 
 30 W191 indentation contains tabs 

Этот же инструмент также доступен в Интернете . Просто скопируйте и вставьте свой код в инструмент и посмотрите результат проверки.

pep8online.com результатпроверки{.ezlazyload .img-responsive}

Заключение

Написать правильный код Python не всегда легко. Но, к счастью, есть рекомендации, которые помогают, а также инструменты командной строки, чтобы убедиться, что ваш код соответствует этим рекомендациям. С различными доступными ресурсами это может быть очень просто :)

Благодарности

Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus