Существует множество принципов, методов и лучших практик для написания чистого кода на Python. Ниже приведены несколько советов, которые помогут Вам начать работу и упростить процесс написания
-
Имена переменных должны быть snake_case и в нижнем регистре
first_name
-
Используйте информативные описательные имена, которые легко читаются.
# Не рекомендуется au = 105 # Рекомендуется active_users = 105
-
Имена констант должны быть snake_case и в верхнем регистре
LAST_NUMBER
-
Не используйте магические числа.
# Не рекомендуется def roll_dice(): return random.randint(0, 4) # what is 4 supposed to represent? # Рекомендуется DICE_SIDES = 4 def roll_dice(): return random.randint(0, DICE_SIDES)
-
Имена функций должны быть snake_case и в нижнем регистре
(quick_sort())
; -
Вы должны подробно описывать, но только релевантную информацию. Например, хорошие имена функций описывают то, что они делают хорошо, не включая подробности
DICE_SIDES = 4
# Не рекомендуется
def roll_dice_using_randint():
return random.randint(0, DICE_SIDES)
# Рекомендуется
def roll_dice():
return random.randint(0, DICE_SIDES)
Максимальная длина строки. Постарайтесь ограничить свои строки примерно 79 символами, что является рекомендацией, приведенной в руководстве по стилю PEP 8
Чтобы держать типизацию под контролем — применяют аннотации типов данных Type Hints
. Это явное указание типа ожидаемых данных при объявлении переменных, классов и функций.
Чтобы указать тип переменной в Python, просто добавьте двоеточие с пробелом, за которым следует тип (str, int, List[] и т. д.), сразу после имени переменной.
from typing import List
name: str = 'Tommy'
age: int = 24
height_in_meters: float = 1.7
colleagues: List[str] = ['Alicia', 'John']
В функциях указывают Type Hints для аргументов и возвращаемого значения , мы добавляем стрелку –>, за которой следует его тип.:
from typing import Dict, List
def convert_celcius_to_fahrenheit(celcius_temp: float) –> float:
return (celcius_temp * 9/5) + 32
def send_email(subject: str, body: str, recipients: List[str], cache: Dict[str,str])–> bool:
pass
Рекомендации к оформлению комментариев:
- начинайте комментарий со знака
#
; - первое слово пишите с заглавной буквы;
- следите за длиной строки — она должна быть не больше 72 символов;
- заканчивайте комментарий точкой.
Используйте комментарии, когда нужно:
- указать на участок кода, на который стоит обратить внимание;
- пояснить сложные алгоритмы или логику;
- указать на код, который нужно доработать;
- указать на код, который хочется позже разобрать.
-
После открывающих тройных кавычек
"""
не должно быть пробела. Докстринг начинается с заглавной буквы и заканчивается точкой:"""Возвращает число 1."""
-
Если докстринг не умещается в одну строку — можно разбить его на несколько строк. Отступы на новой строке должны выровнять текст по кавычкам:
def tricky_func(): """Можно перенести так. """ def muddy_func(): """ А можно - так. """
-
Если документируется класс — после строки документации оставляется пустая строка. В остальных случаях код должен начинаться сразу после докстринга.
Также о правилах оформления докстрингов можно ознакомиться подробнее в стандарте PEP257.
- f-строки должны использовать только простой доступ к переменным и свойствам с предварительным назначением локальной переменной для более сложных случаев:
# Разрешено
f'hello {user}'
f'hello {user.name}'
f'hello {self.user.name}'
# Не разрешено
f'hello {get_user()}'
f'you are {user.age * 365.25} days old'
-
В каждой строке расположите элементы импорта в алфавитном порядке с элементами в верхнем регистре, перед элементами в нижнем регистре.
-
Разорвите длинные строки скобками и сделайте отступ на 4 пробела. Включите запятую после последнего импорта и поместите закрывающую круглую скобку в отдельную строку.
-
Используйте одну пустую строку между последним импортом и любым кодом уровня модуля и используйте две пустые строки над первой функцией или классом.
-
Например (комментарии предназначены только для пояснительных целей):
django / contrib / admin / example.py ¶
# future
from __future__ import unicode_literals
# standard library
import json
from itertools import chain
# third-party
import bcrypt
# Django
from django.http import Http404
from django.http.response import (
Http404, HttpResponse, HttpResponseNotAllowed, StreamingHttpResponse,
cookie,
)
# local Django
from .models import LogEntry
# try/except
try:
import yaml
except ImportError:
yaml = None
CONSTANT = 'foo'
class Example:
# ...
- По возможности используйте удобный импорт. Например, сделайте так:
from django.views import View
вместо:
from django.views.generic.base import View