Именование в Python — как выбирать имена и почему это важно
Начинающие программисты не придают значение именованию переменных при написании кода. Особенно это касается новых проектов — есть какая-то идея, её нужно реализовать и получить результат. Нет времени на то, чтобы задумываться о названиях для переменных, функций, классов и т.п.
Но проект растёт, количество кода увеличивается, и в один прекрасный день разработчик понимает, что 80% его времени уходит на чтение кода и его модификацию (а вовсе не на написание нового кода). Код, написанный неделю назад, кажется незнакомым — приходиться тратить время и силы чтобы вспомнить, что он делает. Плохое именование усугубляет картину:
# Пример кода с плохим именованием. Чтобы его понять, нужно полностью прочитать код.
import re
def clear_list(list, flag=False): # что делает функция clean_list? что такое list, flag?
res = [] # что такое res?
for item in list: # что такое item и какого он типа?
if flag and item[0].islower(): # почему при этом условии нужно сделать continue?
continue
if re.match("^[A-Za-zА-Яа-я]*$", item): # регулярка это смысл всей функции?
res.append(item)
return res
f = open("file.txt", "r", encoding='utf-8') # что находится в файле?
content = f.read().splitlines() # какую информацию мы получим в переменной content?
users = clear_list(content, True) # users — это какие-то абстрактные пользователи
Минусы такого именования:
- Увеличится время на чтение кода;
- Вы будете тратить много сил на то, чтобы вспомнить свой же код, написанный ранее;
- Больше связей между сущностями придется держать в голове;
- Коллега по цеху, работая с вашим кодом, вряд ли скажет вам спасибо.
Основная суть программирования — это управление сложностью. Поддерживать сотни тысяч строк кода — достаточно сложно. Для уменьшения сложности приложение разбивают на модули, методы и классы. Правильное именование переменных также помогает в управлении сложностью.
Управление сложностью является сущностью компьютерного программирования.
Ниже рассмотрим, как правильно именовать переменные в Python, какую нотацию использовать + кратко рассмотрим стандарт РЕР8.
Допустимые имена переменных в Python
Вы можете придумать любые названия для переменных в Python, но есть несколько правил, которые нужно соблюдать.
Правила для переменных в Python:
- Имя переменной должно начинаться с буквы (
test
) или символа подчеркивания (_test
); - Имя переменной не может начинаться с цифры;
- Имя переменной может содержать только буквенно-цифровые символы и подчеркивание (Az, 0-9 и _);
- Имена переменных чувствительны к регистру (
test
,Test
иTEST
— три разные переменные). - Имя переменной не должно совпадать с зарезервированным ключевым словом.
Список всех зарезервированных ключевых слов можно посмотреть так:
import keyword
print(keyword.kwlist)
Если нарушить правило именования, получим SyntaxError
:
3r = 10
print(3r)
File "test.py", line 1
3r = 10
^
SyntaxError: invalid syntax
Нотация в Python: CamelCase или under_score?
Нотация — это соглашение об именовании. Наиболее популярные нотации в программировании — camel case и underscore.
camelCase
(еще называется "верблюжья нотация") — это стиль, в котором слова пишутся слитно, а каждое слово начинается с прописной (большой) буквы. Имеется два подвида этого стиля: lowerCamelCase (все слова кроме первого начинаются с прописной буквы) и UpperCamelCase (все слова, в том числе и первое пишутся с большой буквы).
under_score
(snake_case) — при использовании этого стиля в качестве разделителя используется символ подчеркивания "_", а все слова начинаются со строчной (маленькой) буквы;
💭 Существует также стиль kebab-case
, который похож на under_score, но вместо знака подчеркивания "_" в нем используется тире "-".
В Python преимущественно используется нотация under_score
Одно из правил Zen of Python (PEP20) — "читаемость имеет значение". Нотация under_score
отлично вписывается в это правило, т.к. она удобна для чтения. Это подтверждено исследованием, проведенным в департаменте компьютерных наук Кентского государственного университета в США. В нем, на основании количества фиксаций и продолжительности взгляда был произведен анализ влияния типа нотации на точность, время и усилия, необходимые для распознавания идентификатора. В ходе исследования было доказано, что новички распознают переменные, разделенные подчеркиванием в два раза быстрее и тратят на это меньше усилий. У опытных пользователей эта разница не так велика.
Однако under_score
— не единственная нотация, рекомендуемая к использованию в Python. Вот гайдлайн по именованию, основанный на рекомендациях Гвидо ван Россума (автора языка Python):
Как выбирать имена для переменных в Python
Основной принцип хорошего именования — имена должны быть содержательными (полностью отражать своё назначение). Перед тем, как дать имя переменной, функции или классу, ответьте на вопросы:
- Почему эта переменная (функция, класс и т.п.) существует?
- Что она делает? (или какие данные в ней хранятся?)
- Как используется?
👎 Пример плохого именования:
def area(side1, side2):
return side1 * side2
d = area(4, 5)
В данном примере переменная d
не обозначает ровным счётом ничего. По названию функции area
не понятно, что она делает, какие параметры принимает и что возвращает.
👍 Пример хорошего именования:
def get_rectangle_area(length, width):
return length * width
area = get_rectangle_area(4, 5)
В примере понятно что делает функция get_rectangle_area
(передав длину и ширину, функция вычисляет и возвращает площадь прямоугольника). Результат попадет в переменную area
(площадь).
Содержательное имя понятно, легко читается и не требует дополнительных комментариев.
Вот еще несколько рекомендаций по выбору имён в Python:
⚡ Подбирайте имена на английском языке. Не нужно использовать русские имена переменных и писать их транслитом. Для программиста важно знать английский язык.
def proverka_zdorovya(): # плохо
pass
def health_check(): # хорошо
pass
⚡ Для функций используйте глагол (например "купить", "получить", "распечатать"), для переменных, модулей и классов используйте существительное (например "список", "покупатели", "товары").
Частая ошибок новичков — называть функцию существительным:
def speed_calculator(distance, time): # неправильно (калькулятор скорости)
pass
def calculate_speed(distance, time): # правильно (рассчитать скорость)
pass
⚡ Имена функций должны быть как можно короче. Функция выполняет всего одно действие и именно оно должно отображаться в её имени.
def create_text_utf8_pipe_from_input(): # плохо
pass
def create_pipe(): # хорошо
pass
⚡ Перед именами булевских переменных (и методов, возвращающих тип bool
), добавляйте префикс "is".
def is_goal_state(): # хорошо
pass
is_active = True # хорошо
Там где не получается использовать "is", можно использовать "has" или "can". Пример: has_children()
.
⚡ Используйте удобопроизносимые имена. Людям удобно работать со словами. Часть мозга специализируется на обработке слов — нужно использовать эту часть мозга.
# пример плохого именования (имена трудно произносить вслух)
class GlobalFRTEV: # плохо
def get_any_mdhd(self): # плохо
pass
def get_any_mdhl(self): # плохо
pass
def get_any_mdhf(self): # плохо
pass
Имена будут использоваться в обсуждении с коллегами. Рассказывать про баг в методе get_any_mdhf класса GlobalFRTEV будет достаточно проблематично.
⚡ Использовать однобуквенные переменные не рекомендуется. Их можно использовать исключительно для локальных переменных в небольших методах.
r = requests.get('https://pythonchik.ru') # плохо
response = requests.get('https://pythonchik.ru') # хорошо
⚡ Не нужно разрабатывать и использовать свою систему кодирования имен. Такие имена трудно произносить и в них можно сделать опечатку. К тому же, каждый новый сотрудник должен будет изучать вашу систему кодирования.
tm1_word = "Hello" # плохо
⚡ Также не следует использовать юмор при выборе имени файла. Ведь шутка может быть понятна не всем. Также не рекомендуется использовать каламбуры и сленг.
⚡ Помните, что ваш код будут читать программисты, поэтому используйте слова из профессиональной области, например, названия алгоритмов, паттернов или математические термины. Также полезно использовать слова из предметной области, к которой принадлежит решаемая задача.
💭 Больше полезных сведений о выборе имен идентификаторов и другие советы, которые пригодятся при написании кода, можно найти в книгах:
- Роберт Мартин "Чистый код" ("Содержательные имена", стр. 39);
- Стив Макконнелл "Совершенный код" ("Сила имен переменных", стр. 252).
Именование переменных в PEP8
В стандарте РЕР8 описаны следующие стили именования:
- b — идентификатор из одной маленькой буквы;
- B — идентификатор из одной большой буквы;
- lowercase — одно слово в нижнем регистре;
- lower_case_with_underscores — нескольких слов из маленьких букв, между словами подчеркивания;
- UPPERCASE — одно слово заглавными буквами;
- UPPERCASE_WITH_UNDERSCORES — слова из заглавных букв, между словами подчеркивания;
- CapitalizedWords — несколько слов без пробелов между ними, но каждое начинается с прописной буквы (CamelCase);
- mixedCase — несколько слов без пробелов между ними, первое слово пишется с маленькой буквы, каждое последующее — с большой;
- Capitalized_Words_With_Underscores — имена переменных состоят из нескольких слов, которые начинаются с большой буквы, разделенных между собой знаком подчеркивания "_".
О стандартах именования читайте в PEP8 (раздел "Naming Conventions").
💁♂️ Для удобства, среды разработки (например PyCharm) автоматически проверяют, насколько код соответствует рекомендациям стандарта РЕР8. Если имя идентификатора не будет соответствовать соглашениям, то IDE подчеркнет переменную, а если навести на нее мышку, появится сообщение с подсказкой.
Хороший код документирует сам себя. При правильном именовании, не возникает вопросов по тому, что происходит в отдельных частях кода. И отпадает необходимость писать комментарии к каждой строке.
Чтобы прокачать навык именования переменных, читайте чужой код крупных проектов (например на github). Смотрите, какие имена используют опытные разработчики, анализируйте и применяйте в своих проектах.
Отличная статья для начинающих
Спасибо, классная статья и главное с отсылками к хорошим книгам
Хорошая статья, спасибо!
Много непонятного! Я второй день изучаю Python и хотел бы подробный разбор примеров. под каждым примером подробно расписать каждую буковку что она означает и зачем здесь стоит. Какую функцию выполняет пример. Информация для тех кто уже нормально плавает в этом.
Когда начинал изучать программирование в целом, наткнулся на тему переменных. Повезло что попался подробный гайд, и я понял что и как. Теперь когда учусь на курсах и вижу название переменных в виде a.b.s мне плохо становится