Ключевое слово pass в Python

Перевод статьи «Python pass (Do Nothing): When And How To Use».

В Python есть специальное ключевое слово pass. Это ключевое слово указывает Python на то, что не нужно делать вообще ничего. Слово «pass» в переводе с английского означает «пропускать, опускать». Т.е. мы говорим: «Просто пропусти эту строку кода и продолжай». Если вы привыкли программировать на C-подобных языках, то, вероятно, вам никогда не требовалось такое утверждение.

Почему же в Python есть ключевое слово pass, хотя в других языках его может и не быть? Где и как вы можете его использовать?

В этой статье мы ответим на эти вопросы и покажем вам несколько ситуаций, в которых pass может понадобиться.

Содержание

Что собой представляет 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, зачем оно нужно, и в каких случаях его следует использовать, а в каких нет. Мы даже рассмотрели довольно интересную альтернативу: многоточие. Надеюсь, статья была вам полезна!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *