Рубрики
Без рубрики

Введение в стиль кодирования Python

Автор оригинала: Frank Hofmann.

Введение в стиль кодирования Python

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

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

Тим Питерс – американский разработчик 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”.

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

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

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 , эта проверка кода была переименована в py code style в 2016 году. Он поддерживается Управлением качества кода Python и принадлежит к ряду инструментов, таких как анализаторы исходного кода pylint и pyflakes , проверка сложности mccabe , а также проверка docstring pydocstyle .

py code style анализирует ваш код 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-pycode style (для Python 2.x) и python3-py code style (для Python 3.x). Оба они имеют ряд полезных параметров, например:

  • --first : Показать первое появление каждой ошибки (как показано выше). Выходные данные показывают файл, в котором была обнаружена ошибка, а также номер строки и столбец.
  • --show-source : Показать исходный код для каждой ошибки
$ 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):
^
...
  • --статистика : Подсчет ошибок и предупреждений. В следующем примере py code style обнаружил две ошибки – E265 и E302 – а также 30 предупреждений (W191).
$ 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 validationresult

Вывод

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

Признание

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