Лучшие практики в Python

Лучшие практики в Python

В этой статье объясняются лучшие практики программирования на Python.

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

YouTube Video

Лучшие практики в Python

Делайте читаемость кода приоритетом

Сначала рассмотрим «делать читаемость главным приоритетом».

Python — это язык, который ценит «читаемость». В первую очередь пишите код, цель которого понятна с первого взгляда.

1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * b

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

1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantity

Используя конкретные имена переменных, ваш код сам становится документацией.

Пишите явный, понятный код

Далее рассмотрим «написание явного кода».

В Python «явные намерения» предпочтительнее, чем «неявное поведение».

1# Bad example: implicit truthy check
2if data:
3    process(data)

В этом коде неясно, что ожидается от data, что создаёт почву для появления ошибок.

1# Good example: explicit condition
2if len(data) > 0:
3    process(data)

При явно указанных условиях намерение кода соответствует его спецификации.

Делайте функции маленькими и ответственными только за одну задачу

Теперь рассмотрим «делать функции маленькими и ответственными только за одну задачу».

Если одна функция делает слишком много, её сложно тестировать и поддерживать.

1# Bad example: doing too many things
2def handle_user(user):
3    save_to_database(user)
4    send_email(user)
5    write_log(user)

В этом коде процессы тесно связаны, что затрудняет повторное использование и изменение.

1# Good example: single responsibility
2def save_user(user):
3    save_to_database(user)
4
5def notify_user(user):
6    send_email(user)
7
8def log_user(user):
9    write_log(user)

Разделяя функции, вы делаете их роли более понятными, а тестирование проще.

Активно используйте аннотации типов

Далее рассмотрим «активное использование аннотаций типов».

Аннотации типов служат документацией и являются мощным инструментом для предотвращения ошибок.

1# Bad example: Without type hints
2def add(a, b):
3    return a + b

В этом коде типы аргументов и возвращаемого значения неясны, поэтому легко ошибиться.

1# Good example: With type hints
2def add(a: int, b: int) -> int:
3    return a + b

С аннотациями типов автодополнение в IDE, статический анализ и читаемость значительно улучшаются.

Явно указывайте возможность возврата значения None

Далее рассмотрим «явное указание возможности возврата значения None».

Пользователи функций, которые могут возвращать None, часто упускают этот момент.

1# Bad example: Ambiguous return value
2def find_user(user_id):
3    if user_id == 1:
4        return {"id": 1, "name": "Alice"}
5    return None

В этом коде неясно, будет ли возвращаемое значение.

1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5    if user_id == 1:
6        return {"id": 1, "name": "Alice"}
7    return None

С помощью Optional вы можете передать возможность возвращения None через тип.

Не перехватывайте исключения слишком обобщённо

Далее рассмотрим «не перехватывать исключения слишком широко».

Обработка исключений должна перехватывать только то, что действительно необходимо.

1# Bad example: catching all exceptions
2try:
3    result = int(value)
4except Exception:
5    result = 0

Этот код может скрывать ошибки, которые стоило бы заметить.

1# Good example: catch specific exception
2try:
3    result = int(value)
4except ValueError:
5    result = 0

Ограничивая обработку исключений, вы не упустите неожиданные проблемы.

Безопасно работайте с ресурсами с помощью оператора with

Теперь рассмотрим «безопасную работу с ресурсами с помощью оператора with».

Ресурсы, такие как файлы и блокировки, всегда должны освобождаться надёжно.

1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()

В этом коде при возникновении исключения метод close() может не быть вызван.

1# Good example: using context manager
2with open("data.txt") as file:
3    content = file.read()

С помощью оператора with освобождение ресурсов гарантировано даже при возникновении исключения.

Используйте списковые включения по назначению

Теперь рассмотрим «адекватное использование списковых включений».

Простые операции преобразования можно лаконично записать с помощью списковых включений.

1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4    squares.append(i * i)

В этом коде основную логику сложно разглядеть.

1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]

Адекватное применение списковых включений повышает читаемость кода.

Избегайте магических чисел

Далее рассмотрим «избегание магических чисел».

Прямое использование чисел и строк делает смысл кода неочевидным.

1# Bad example: magic number
2if status == 404:
3    handle_not_found()

В этом коде предполагается, что вы знаете значение 404.

1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5    handle_not_found()

Присваивание имён делает намерения понятными.

Пишите сопровождаемый код, а не просто «рабочий»

Наконец, рассмотрим «написание сопровождаемого кода, а не просто рабочего».

Важный момент — смогут ли ваш будущий «я» или другие прочитать этот код.

1# Bad example: Hard to maintain
2def f(x):
3    return x * 1.08 + 100

В этом коде невозможно понять спецификацию.

1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6    return price * TAX_RATE + BASE_FEE

Отражая смысл в именах, вы делаете сам код спецификацией.

Резюме

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

Вы можете следовать этой статье, используя Visual Studio Code на нашем YouTube-канале. Пожалуйста, также посмотрите наш YouTube-канал.

YouTube Video