ПрограммированиеPython Team Lead

Расскажите о соглашениях по именованию (PEP8 и др.) в Python. Как несоблюдение этих соглашений влияет на практику работы с кодом? Приведите примеры реальных последствий нарушения PEP8 в проектах.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В Python действует ряд соглашений по стилю кода, основной из которых — PEP8:

  • Имя переменных/функций: lower_case_with_underscores
  • Имя классов: CapitalizedCamelCase
  • Константы: ALL_CAPS
  • Длина строки: до 79 символов
  • Отступы: 4 пробела (не табы!)
  • Пробелы вокруг операторов: a = b + c
  • Импорты: каждый импорт — отдельная строка, сначала стандартные либы, потом сторонние, потом локальные

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


Вопрос с подвохом.

В PEP8 рекомендуется не использовать однобуквенные имена переменных. Однако можно ли в list comprehensions или в lambda использовать короткие имена? Почему?

Ответ: В базовом случае для кратких итераций (например, в list comprehensions для переменных-маркеров, вроде x, i, j) допускается использовать однобуквенные имена, чтобы не загромождать короткие выражения. Для сложных выражений лучше давать осмысленные имена.

Пример:

# Допустимо: squares = [x**2 for x in numbers] # Лучше: squares = [number**2 for number in numbers]

Примеры реальных ошибок из-за незнания тонкостей темы.


История 1

В банковском проекте столкнулись с тем, что часть функций и параметров была названа в разных традициях (CamelCase, snake_case, через дефис). Новый член команды постоянно путался, где именно используются имена — почти две недели ушло на устранение коллизий и переименование переменных.


История 2

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


История 3

На крупном образовательном портале перемешали короткие и длинные имена переменных. Например, функцию для обработки логов назвали l(), а обработчик входа — long, что во многих IDE заняло много времени на навигацию и вызвало путаницу в использовании функции с элементом l из списка.