Перевод статьи «Python pass (Do Nothing): When And How To Use».
В Python есть специальное ключевое слово pass. Это ключевое слово указывает Python на то, что не нужно делать вообще ничего. Слово «pass» в переводе с английского означает «пропускать, опускать». Т.е. мы говорим: «Просто пропусти эту строку кода и продолжай». Если вы привыкли программировать на C-подобных языках, то, вероятно, вам никогда не требовалось такое утверждение.
Почему же в Python есть ключевое слово pass, хотя в других языках его может и не быть? Где и как вы можете его использовать?
В этой статье мы ответим на эти вопросы и покажем вам несколько ситуаций, в которых pass
может понадобиться.
Содержание
- Что собой представляет pass в Python и зачем он нужен?
- Когда использовать ключевое слово pass в Python
- Когда не стоит использовать pass
- Альтернатива использованию pass
- pass и continue
- Заключение
Что собой представляет pass в Python и зачем он нужен?
В Python pass
– это ключевое слово, такое же, как if
, else
, return
и другие ключевые слова. pass
ничего не делает. Это ключевое слово велит Python продолжить выполнение программы, игнорируя эту строку.
Зачем нужен pass
, если он ничего не делает? Чаще всего его используют как заполнитель для будущего кода.
В синтаксисе Python большое значение имеют отступы. Python может распознать блок кода, только если его строки имеют одинаковые отступы (обычно кратные четырем пробельным символам). При этом грамматика Python определена таким образом, что в некоторых местах добавление кода является обязательным. Отсутствие кода в этих местах не имело бы особого смысла и не способствовало бы читабельности.
Давайте рассмотрим четыре места, где обязательно должен быть код. Их может быть больше, но это самые заметные. Если вы не введете код в этих местах, Python завершит программу с исключением IndentationError:
- определения функций
- определения классов
- блоки
if... else
- блоки
try... except... finally
Давайте попробуем использовать некоторые из них для демонстрации:
def myfunction(): # Эта функция не имеет тела, что не допускается myfunction()
Python не сможет выполнить этот код и выдаст следующее сообщение об ошибке:
File "myfile.py", line 4 myfunction() ^ IndentationError: expected an indented block after function definition on line 1
Аналогичные жалобы будут и в других случаях:
if True: # Нет кода, а это недопустимо! else: # Здесь тоже кода нет, хотя он обязателен try: # Давайте-ка попробуем не делать ничего (так нельзя) except Exception: # Опять же, блок не может быть пустым! class MyClass: # Совершенно пустой класс недопустим
Как видите, комментарий не считается кодом, поэтому комментарии не получится использовать в качестве заполнителей! Вот тут-то и вступает в игру оператор pass
. Во всех описанных выше ситуациях pass
можно использовать для вставки кода, который ничего не делает, но при этом обеспечивает само наличие какого-то кода. Давайте заполним пробелы:
def myfunction(): pass myfunction() if True: pass else: pass try: pass except Exception: pass class MyClass: pass
Все это совершенно бесполезный, но при этом валидный код.
Когда использовать ключевое слово pass в Python
Так когда же следует использовать pass
? Есть несколько причин.
pass может быть плейсхолдером
Ключевое слово pass
может использоваться для создания заглушек функций и классов, которые будут реализованы позже. Таким образом мы можем создать работоспособный код, который не будет выбрасывать ошибки, даже если не все функции, классы, обработка ошибок и if-else
реализованы.
Игнорирование исключений
Очень часто исключения игнорируются, особенно если это KeyErrors. Этот паттерн вы будете видеть часто:
try: email = customer['email'] send_notification(email, ...) except KeyError: # Это не конец света, давайте продолжим pass
Мы ловим ошибку, но не хотим ничего с ней делать. Однако Python требует код в блоке except
, поэтому мы используем pass
.
Создание точки останова при отладке
Еще одно интересное использование pass
– это создание точек останова в коде. Иногда вы хотите создать точку останова сразу после некоторого кода. Если этот код находится в конце функции, вы можете добавить в конец дополнительный pass
и установить там точку останова.
Создание подклассов без дополнительной функциональности
Если вы хотите создать подкласс без добавления функциональности, вы можете использовать для этого pass
. Это может пригодиться, например, если вы хотите создать исключение с собственным именем:
class MyCustomException(Exception): pass
Когда не стоит использовать pass
На мой взгляд, в производственном коде ключевое слово pass следует использовать очень редко. Как уже говорилось, использование pass
для игнорирования исключения – это, конечно, нормально. Но стоит ли поставлять в продакшен код, полный заглушек, использующих pass
? Я не уверен!
Если вы часто используете ключевое слово pass
, например, в конструкциях if... else
, возможно, вам стоит переписать свой код. Давайте рассмотрим пример:
if customer_exists: pass else: redirect_to_signup_page()
В этом примере мы проверяем, существует ли пользователь. Если да, то используем pass
для продолжения. Если нет – перенаправляем на страницу регистрации. Подобный код можно легко переписать, что приведет к уменьшению количества строк и снижению сложности. Часто все, что вам нужно сделать, – это перевернуть логику:
if not customer_exists: redirect_to_signup_page()
Мы сэкономили две строки кода и сделали код более читабельным.
Альтернатива использованию pass в Python
Я уже писал статью о специальном объекте в Python, который называется многоточием. В той статье я упомянул, что мы можем использовать многоточие для замены pass
. Объект многоточия ничего не делает, поэтому его можно использовать точно так же, как и pass. Вот пример:
def create_account(username, password): # TODO: implement me ...
Вместо pass
я использовал три точки ...
, которые образуют объект многоточия. Выглядит довольно круто, как по мне, и буквально просит, чтобы его заменили каким-нибудь настоящим кодом!
Но многоточие – не единственный вариант. Во всех местах, где вы могли бы поставить pass
, вы можете вставить:
- число, например 0
- булево значение (True или False)
- строку (“Пока не реализовано”).
Несмотря на все эти альтернативы, pass
является фактическим стандартом в этих случаях и ясно сообщает читателю кода, что место намеренно оставлено пустым или для него должен быть реализован код. Поэтому в случае сомнений используйте pass
, особенно если вы работаете в команде.
pass и continue
Многие люди спрашивали меня, в чем разница между pass
и continue
. Они могут выглядеть одинаково, но это далеко не одно и то же. В то время как pass
вообще ничего не делает, continue
, по сути, останавливает текущий поток кода и напрямую запускает следующую итерацию цикла. Следовательно, continue
работает только внутри циклов и не может использоваться в качестве замены pass
.
Вот как можно использовать continue
в цикле for
:
# Send voucher to all inactive customers for customer in customers: if customer.is_active(): # Skip this customer continue # do some stuff to send voucher ...
Заключение
В этой статье мы разобрали, что собой представляет ключевое слово pass в Python, зачем оно нужно, и в каких случаях его следует использовать, а в каких нет. Мы даже рассмотрели довольно интересную альтернативу: многоточие. Надеюсь, статья была вам полезна!