что такое pass в python
Как правильно ничего не делать в Python: инструкция pass
Хочешь знать больше о Python?
Подпишись на наш канал о Python в Telegram!
Говорят, что в Python нет ничего проще ключевого слова pass – всего лишь инструкция «ничего не делать», чтобы соблюсти синтаксис языка. Однако не всегда pass служит заглушкой – есть и более интересные применения. Подробнее об этом рассказано в статье The pass Statement: How to Do Nothing in Python, перевод которой опубликовал сайт proglib.io. Представляем его вашему вниманию.
В Python ключевое слово pass – самостоятельная инструкция, которая буквально ничего не делает. Она даже отбрасывается на этапе компиляции байт-кода. В чем же толк от такого оператора-бездельника?
Иногда pass можно встретить в финальном коде на продакшене, но чаще инструкцию используют в процессе разработки. Заметим, что в некоторых случаях сделать что-то – лучше, чем ничего, и pass является не лучшим решением.
В этом туториале мы изучим:
Python и синтаксис pass
Синтаксис Python предполагает, что в некоторых случаях после двоеточия новые блоки кода идут с отступом. Например, после объявления цикла for или условия if :
Тело условия или цикла не может быть пустым:
Чтобы структура кода осталась корректной, нужно использовать инструкцию pass :
В первом случае из-за невалидного синтаксиса вызывается исключение, во втором – pass позволяет соблюсти требования Python.
Временное использование pass
Есть много ситуаций, в которых инструкция pass может быть полезна в процессе разработки, даже если она не появится в окончательной версии кода. Подобно строительным лесам pass может поддерживать структуру программы, прежде чем ее заменят на что-то дельное.
Будущий код
При продумывании макроструктур программы не нужно отвлекаться на низкоуровневые решения. Инструкция pass помогает оформить ключевые конструкции, а потом вернуться к деталям.
Представьте: нужна функция, которая находит среднюю часть строки, записывает результат в файл и возвращает его:
Но вам пока не нужна вызываемая функция save_to_file() – в первую очередь вы хотите проверить, нет ли ошибки неучтенной единицы. Однако функции save_to_file() еще не существует – при ее вызове будет вызвано исключение.
Теперь функцию get_and_save_middle() можно тестировать.
Другой вариант использования pass – когда мы пишем сложную структуру управления потоком и нужен заполнитель для будущего кода. Например, для реализации fizz-buzz полезно сначала набросать структуру кода:
Такие структурные скелеты выстраивают логику и порядок ветвления. В приведенном примере первый оператор if должен проверять делимость на 15, потому что любое число, которое делится на 15, также делится на 5 и 3. Предварительное понимание общей структуры полезно независимо от реализации конкретного вывода.
После того как вы прониклись логикой задачи, можно решить, будет ли использоваться print() прямо в коде:
Функция напрямую печатает строки, однако из-за этого ее будет неудобно тестировать. Разумная альтернатива – написать функцию, возвращающую строковое значение:
Выявление основных условий и структуры с помощью pass позволяет лучше понять, как впоследствии должна работать программа.
Такой код даже позволит создавать экземпляры класса.
Закомментированный код
Другая ситуация, в которой мы ходим закомментировать код во время устранения неполадок, – когда скрываемый код имеет нежелательный побочный эффект, например, отправку электронной почты или обновление счетчика.
Маркеры для отладчиков
Хотя инструкция pass ничего не делает, она позволяет установить здесь маркер. Теперь код можно запустить в отладчике и отлавливать строки-палиндромы.
Пустые функции и методы
Распространенная ситуация – код определяет класс, наследуемый от класса, требуется переопределение метода. Вполне вероятно, что новый метод не должен делать или ему даже нужно запретить что-то делать:
Необходимые функции и методы в этом случае по-прежнему поддерживаются и не вызывают исключений при вызове.
Пустые классы на примере исключений
Python поддерживает концепцию наследования исключений. Например, встроенное исключение LookupError является родительским для KeyError :
Иногда возникает задача вызова исключений, наследуемых от определенного класса и соответствующих некоторому набору инструкций по обработке исключений. Сами исключения не выполняют никаких действий, а служат простейшими сигнализаторами: произошла такая-то ошибка.
Простой пример: задача проверки паролей. Прежде чем пользователь сможет изменить пароль на веб-сайте, программа на сервере тестирует пароль на соответствие правилам:
Примечание. Этот пример предназначен исключительно для иллюстрации семантики и методов Python. Для получения дополнительной информации изучите рекомендации Национального института стандартов и технологий (NIST) и исследования, на которых они основаны.
Каждая из соответствующих ошибок должна вызывает собственное исключение. Следующий код реализует указанные правила:
Эта функция вызовет исключение, если пароль не соответствует какому-либо из описанных правил. Более реалистичный пример отметил бы все несоблюденные правила, но такая задача выходит за рамки данного руководства.
В этом примере friendly_check() перехватывает только InvalidPasswordError поскольку другие исключения типа ValueError могут представлять исключения, порождаемые в самой программе проверки ошибки. Функция печататет имя и значение исключения, соответствующее правилу. Оператор pass позволил без особых сложностей определить четыре класса исключений.
Маркирующие методы
Некоторые методы в классах существуют не для того, чтобы их вызывать. Иногда они просто определенным образом помечают сам класс.
Примечание. Название модуля стандартной библиотеки Python abc соответствует сокращению от abstract base classes. Модуль помогает определять классы, которые не предназначены для создания экземпляров, а служат базой для других классов.
Хотя реалистичный класс Origin выглядел бы сложнее, в этом примере показана его основа. Метод Origin.description() никогда не будет вызван – все подклассы его переопределяют.
Есть и другие примеры использования таких маркеров вне стандартной библиотеки Python. Например, они используются в пакете zope.interface для обозначения методов интерфейса и в automat для входных данных конечного автомата. Во всех этих случаях классы должны иметь методы, но никогда не вызывают их.
Альтернативы pass
Инструкция pass – не единственный способ «ничего не делать». Любое выражение в Python это валидная инструкция, как и любая константа. Фактически следующие инструкции тоже сами по себе ничего не делают:
Docstrings
Даже если строка документации не является обязательной, часто она является хорошей заменой инструкции pass в пустом блоке, так как более полно описывает назначение блока:
Примечание. Строки документации кода обычно описывают код более тщательно, чем приведенные примеры.
Во всех приведенных случаях строка документации делает код понятнее, а работу с ним – более удобной.
Ellipsis
Эта функция не только ничего не делает, но и находится в файле, который интерпретатор Python обычно не запускает.
Вызов исключения
Перманентное использование pass
Применение pass в try … except
Примечание. Игнорируя исключения, важно соблюдать осторожность. Исключение обычно подразумевает, что произошло что-то непредвиденное и требуется некоторая последовательность действий для решения проблемы. Игнорирование исключений всегда должно быть чем-то оправдано.
Стоит заметить, что в схожих ситуациях оператор pass часто заменяется записью в журнал. Однако этого не требуется, если ошибка ожидаема и легко интерпретируема.
Например, если вы хотите, чтобы приведенная выше функция ensure_nonexistence() работала и с каталогами, и с файлами, можно использовать следующий подход:
Использование pass в цепочках if … elif
Представьте, что рекрутер попросил вас написать fizz-buzz с такимиусловиями:
Как и во всех вопросах по кодингу, есть много способов решить эту проблему. Один из них – использовать цикл for с цепочкой, которая имитирует само описание:
Заключение
Оператор Python Pass| Что Делает Pass В Python
Оператор python pass рассматривается как оператор no operation, то есть он потребляет цикл выполнения как допустимый оператор python, но ничего не происходит
Оператор Python Pass| Что Делает Pass В Python
В этом уроке мы обсудим ключевое слово python pass или оператор, а также когда и где мы можем использовать pass. Мы увидим примеры ключевого слова pass и поймем, как это работает.
Что такое Pass в Python?
В Python оператор pass рассматривается как оператор no operation, то есть он потребляет цикл выполнения как допустимый оператор python, но на самом деле ничего не происходит при выполнении прохода.
Оператор pass очень похож на комментарий, но интерпретатор python выполняет операторы pass как допустимый оператор python, в то время как он полностью игнорирует оператор comment.
Он обычно используется для обозначения “null” или нереализованных функций и тела циклов.
Что такое использование операторов pass и Как это работает
Синтаксис оператора pass
Он имеет очень простой синтаксис,
Мы действительно не можем оставить будущую реализацию методов или логики пустой, так как это вызовет ошибку при выполнении. Из-за этого оператор pass очень удобен.
Давайте Разберемся С ключевым словом pass На примере
1. Что делать, если мы не используем ключевое слово pass?
Что произошло в коде выше или за кодом
Хотя выражение его лица было неправильным, он не шел и не бежал в любом случае, но у него должно было быть тело. В тот момент, когда интерпретатор обнаруживает, что оператор if не имеет соответствующего ему тела, интерпретатор выдает ошибку.
2. Использование ключевого слова/оператора pass и устранение ошибки
Примечание: Таким образом, чтобы избежать ошибок компиляции, вы можете использовать оператор pass.
Оператор Pass для пустой функции
В Python нет понятия абстрактных функций. Поэтому, если нам нужно определить пустую функцию, мы не можем написать ее так.
Мы можем использовать оператор pass для определения пустой функции. Функция будет иметь оператор, но она ничего не будет делать.
Можем ли мы использовать несколько Операторов pass в функции Python?
Да, мы можем иметь несколько операторов pass в функции или блоке кода в Python.
Это потому, что оператор pass не завершает href=”https://docs.python.org/3/library/functions.html”>функция. Его единственная работа состоит в том, чтобы предоставить пустое утверждение. href=”https://docs.python.org/3/library/functions.html”>функция. Его единственная работа состоит в том, чтобы предоставить пустое утверждение.
Оператор Python Pass с обработкой исключений
Если вы не хотите ничего делать для определенного типа исключения после его перехвата, вы можете использовать оператор pass.
Примеры оператора Python Pass
Пример 1: Программа Python, использующая класс с пропуском
Пример 2: Программа Python, использующая оператор pass в цикле for
Пример 3: Использование ключевого слова pass в операторе if
Пример 4: Программа Python, использующая pass in a while loop
Pass statement vs comment
Вам может быть интересно, работает ли комментарий python аналогично оператору pass, поскольку он ничего не делает, поэтому мы можем использовать комментарий вместо оператора pass. Ну, это не так, комментарий не является заполнителем, и он полностью игнорируется интерпретатором Python, в то время как, с другой стороны, pass не игнорируется интерпретатором, он говорит интерпретатору ничего не делать.
Можем ли мы использовать комментарий вместо пропуска?
Мы не можем использовать комментарий вместо pass, потому что интерпретатор проигнорирует комментарий, а оператор pass вернет null.
Pass—это нулевая операция-когда она выполняется, ничего не происходит. Он полезен в качестве заполнителя, когда оператор требуется синтаксически, но код не должен выполняться.
Вывод
Итак, в этом посте мы увидели, как оператор pass можно использовать внутри программы Python, не нарушая другие части кода и позволяя интерпретатору Python выполнять код, который также не был реализован.
Кроме того, если у вас есть какие-либо сомнения или вопросы, прокомментируйте их ниже. Мы постараемся решить эту проблему как можно скорее.
Использование выражений Break, Continue и Pass при работе с циклами в Python 3
Published on February 19, 2021
Введение
Использование циклов for и циклов while в Python помогает эффективно автоматизировать и воспроизводить задачи.
Выражение Break
Рассмотрим пример использования выражения break в цикле for :
В этой небольшой программе переменная number инициализируется как 0. Затем выражение for строит цикл, пока значение переменной number составляет меньше 10.
При выполнении этого кода результат будет выглядеть следующим образом:
Выражение break заставляет программу выйти из цикла.
Выражение Continue
Выражение continue дает возможность пропустить часть цикла, где активируется внешнее условие, но при этом выполнить остальную часть цикла. При этом прерывается текущая итерация цикла, но программа возвращается к началу цикла.
Отличие выражения continue от выражения break заключается в том, что код продолжит выполняться несмотря на прерывание, если значение переменной number будет оценено как равное 5. Давайте посмотрим на результаты:
В этом выводе условие Number is 5 никогда не выполняется, но цикл продолжается после этого, чтобы выводить линии для чисел 6–10 до выхода из цикла.
Выражение continue заставляет программу пропустить определенную часть цикла, а затем продолжить выполнение оставшейся части цикла.
Выражение Pass
При активации внешнего условия выражение pass позволяет обрабатывать условия без влияния на цикл; чтение кода будет продолжаться до появления выражения break или другого выражения.
Используя тот же код выше, попробуйте заменить выражение break или continue выражением pass :
Мы запустим программу и оценим вывод:
Используя выражение pass в этой программе, мы видим, что программа работает точно так же, как если бы в ней не было условного выражения. Выражение pass предписывает программе игнорировать это условие и продолжать обычное выполнение программы.
Выражение pass может создавать минимальные классы или выступать в качестве замещающего элемента при работе с новым кодом и действовать на уровне алгоритмов, прежде чем отрабатывать детали.
Заключение
Работаем с функциями в Python
Функция – это структура, которую вы определяете. Вам нужно решить, будут ли в ней аргументы, или нет. Вы можете добавить как аргументы ключевых слов, так и готовые по умолчанию. Функция – это блок кода, который начинается с ключевого слова def, названия функции и двоеточия, пример:
Эта функция не делает ничего, кроме отображения текста. Чтобы вызвать функцию, вам нужно ввести название функции, за которой следует открывающаяся и закрывающаяся скобки:
Пустая функция (stub)
Иногда, когда вы пишете какой-нибудь код, вам нужно просто ввести определения функции, которое не содержит в себе код. Я сделал небольшой набросок, который поможет вам увидеть, каким будет ваше приложение. Вот пример:
А вот здесь кое-что новенькое: оператор pass. Это пустая операция, это означает, что когда оператор pass выполняется, не происходит ничего.
Передача аргументов функции
Теперь мы готовы узнать о том, как создать функцию, которая может получать доступ к аргументам, а также узнаем, как передать аргументы функции. Создадим простую функцию, которая может суммировать два числа:
Каждая функция выдает определенный результат. Если вы не указываете на выдачу конкретного результата, она, тем не менее, выдаст результат None (ничего). В нашем примере мы указали выдать результат a + b. Как вы видите, мы можем вызвать функцию путем передачи двух значений. Если вы передали недостаточно, или слишком много аргументов для данной функции, вы получите ошибку:
Вы также можете вызвать функцию, указав наименование аргументов:
Стоит отметить, что не важно, в каком порядке вы будете передавать аргументы функции до тех пор, как они называются корректно. Во втором примере мы назначили результат функции переменной под названием total. Это стандартный путь вызова функции в случае, если вы хотите дальше использовать её результат.
Вы, возможно, подумаете: «А что, собственно, произойдет, если мы укажем аргументы, но они названы неправильно? Это сработает?» Давайте попробуем на примере:
Ошибка. Кто бы мог подумать? Это значит, что мы указали ключевой аргумент, который функция не распознала. Кстати, ключевые аргументы описана ниже.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Ключевые аргументы
Функции также могут принимать ключевые аргументы. Более того, они могут принимать как регулярные, так и ключевые аргументы. Это значит, что вы можете указывать, какие ключевые слова будут ключевыми, и передать их функции. Это было в примере выше.
Вы также можете вызвать данную функцию без спецификации ключевых слов. Эта функция также демонстрирует концепт аргументов, используемых по умолчанию. Каким образом? Попробуйте вызвать функцию без аргументов вообще!
Функция вернулась к нам с числом 3. Почему? Причина заключается в том, что а и b по умолчанию имеют значение 1 и 2 соответственно. Теперь попробуем создать функцию, которая имеет обычный аргумент, и несколько ключевых аргументов:
Выше мы описали три возможных случая. Проанализируем каждый из них. В первом примере мы попробовали вызвать функцию, используя только ключевые аргументы. Это дало нам только ошибку. Traceback указывает на то, что наша функция принимает, по крайней мере, один аргумент, но в примере было указано два аргумента. Что же произошло? Дело в том, что первый аргумент необходим, потому что он ни на что не указывает, так что, когда мы вызываем функцию только с ключевыми аргументами, это вызывает ошибку. Во втором примере мы вызвали смешанную функцию, с тремя значениями, два из которых имеют название. Это работает, и выдает нам ожидаемый результат: 1+4+5=10. Третий пример показывает, что происходит, если мы вызываем функцию, указывая только на одно значение, которое не рассматривается как значение по умолчанию. Это работает, если мы берем 1, и суммируем её к двум значениям по умолчанию: 2 и 3, чтобы получить результат 6! Удивительно, не так ли?
*args и **kwargs
Вы также можете настроить функцию на прием любого количества аргументов, или ключевых аргументов, при помощи особого синтаксиса. Чтобы получить бесконечное количество аргументов, мы используем *args, а чтобы получить бесконечное количество ключевых аргументов, мы используем *kwargs. Сами слова “args” и “kwargs” не так важны. Это просто сокращение. Вы можете назвать их *lol и *omg, и они будут работать таким же образом. Главное здесь – это количество звездочек. Обратите внимание: в дополнение к конвенциям *args и *kwargs, вы также, время от времени, будете видеть andkw. Давайте взглянем на следующий пример:
Сначала мы создали нашу функцию, при помощи нового синтаксиса, после чего мы вызвали его при помощи трех обычных аргументов, и двух ключевых аргументов. Функция показывает нам два типа аргументов. Как мы видим, параметр args превращается в кортеж, а kwargs – в словарь. Вы встретите такой тип кодинга, если взгляните на исходный код Пайтона, или в один из сторонних пакетов Пайтон.
Область видимость и глобальные переменные
Концепт области (scope) в Пайтон такой же, как и в большей части языков программирования. Область видимости указывает нам, когда и где переменная может быть использована. Если мы определяем переменные внутри функции, эти переменные могут быть использованы только внутри это функции. Когда функция заканчиваются, их можно больше не использовать, так как они находятся вне области видимости. Давайте взглянем на пример:
Если вы запустите этот код, вы получите ошибку:
Это вызвано тем, что переменная определенна только внутри первой функции, но не во второй. Вы можете обойти этот момент, указав в Пайтоне, что переменная а – глобальная (global). Давайте взглянем на то, как это работает:
Этот код работает, так как мы указали Пайтону сделать а – глобальной переменной, а это значит, что она работает где-либо в программе. Из этого вытекает, что это настолько же хорошая идея, насколько и плохая. Причина, по которой эта идея – плохая в том, что нам становится трудно сказать, когда и где переменная была определена. Другая проблема заключается в следующем: когда мы определяем «а» как глобальную в одном месте, мы можем случайно переопределить её значение в другом, что может вызвать логическую ошибку, которую не просто исправить.
Советы в написании кода
Одна из самых больших проблем для молодых программистов – это усвоить правило «не повторяй сам себя». Суть в том, что вы не должны писать один и тот же код несколько раз. Когда вы это делаете, вы знаете, что кусок кода должен идти в функцию. Одна из основных причин для этого заключается в том, что вам, вероятно, придется снова изменить этот фрагмент кода в будущем, и если он будет находиться в нескольких местах, вам нужно будет помнить, где все эти местоположения И изменить их.
Сайт doctorsmm.com предлагает Вам персональные предложения по покупке лайков в ВК к постам и публикациям. Здесь Вы найдете дешевые цены на услуги, а также различные критерии, подходящие к любой ситуации. На сервисе также доступно приобретение репостов, голосов в голосования и опросы сети.
Копировать и вставлять один и тот же кусок кода – хороший пример спагетти-кода. Постарайтесь избегать этого так часто, как только получится. Вы будете сожалеть об этом в какой-то момент либо потому, что вам придется все это исправлять, либо потому, что вы столкнетесь с чужим кодом, с которым вам придется работать и исправлять вот это вот всё.
Подведем итоги
Теперь вы обладаете основательными знаниями, которые необходимы для эффективной работы с функциями. Попрактикуйтесь в создании простых функций, и попробуйте обращаться к ним различными способами.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
The pass Statement: How to Do Nothing in Python
In Python, the pass keyword is an entire statement in itself. This statement doesn’t do anything: it’s discarded during the byte-compile phase. But for a statement that does nothing, the Python pass statement is surprisingly useful.
Sometimes pass is useful in the final code that runs in production. More often, pass is useful as scaffolding while developing code. In specific cases, there are better alternatives to doing nothing.
In this tutorial, you’ll learn:
Free Bonus: Click here to get a Python Cheat Sheet and learn the basics of Python 3, like working with data types, dictionaries, lists, and Python functions.
Python pass Statement: Syntax and Semantics
In Python syntax, new indented blocks follow a colon character ( : ). There are several places where a new indented block will appear. When you start to write Python code, the most common places are after the if keyword and after the for keyword:
After the for statement is the body of the for loop, which consists of the two indented lines immediately following the colon.
In this case, there are two statements in the body that are repeated for each value:
The statements inside this type of block are technically called a suite in the Python grammar. A suite must include one or more statements. It can’t be empty.
In this if statement, removing the pass statement would keep the functionality the same and make your code shorter. You might be wondering why the Python syntax includes a statement that tells the interpreter to do nothing. Couldn’t you achieve the same result by not writing a statement at all?
In some cases, explicitly telling Python to do nothing serves an important purpose. For example, because the pass statement doesn’t do anything, you can use it to fulfill the requirement that a suite include at least one statement:
Even if you don’t want to add any code inside the if block, an if block with no statement creates an empty suite, which is invalid Python syntax.
To fix this, you can use pass :
Temporary Uses of pass
There are many situations in which pass can be useful to you while you’re developing, even if it won’t appear in the final version of your code. Much like scaffolding, pass can be handy for holding up the main structure of your program before you fill in the details.
It might sound strange to write code that will be deleted later, but doing things this way can accelerate your initial development.
Future Code
There are many cases where the structure of the code requires, or could use, a block. While you may eventually have to write code there, it’s sometimes hard to get out of the flow of working on something specific and start working on a dependency. In these cases, a pass statement is a useful way to do the minimal amount of work for the dependency so you can go back to what you were working on.
As a concrete example, imagine writing a function that processes a string and then both writes the result to a file and returns it:
This function saves and returns the middle third of a string. You don’t need to finish implementing save_to_file() before you can test the output for an off-by-one error. However, if save_to_file() doesn’t exist in some form, then you’ll get an error.
This function doesn’t do anything, but it allows you to test get_and_save_middle() without errors.
Another use case for pass is when you’re writing a complicated flow control structure, and you want a placeholder for future code. When implementing the fizz-buzz challenge with the modulo operator, for example, it’s useful to first understand the structure of the code:
This structure identifies what should be printed in each case, which gives you the skeleton of the solution. Such structural skeletons are useful when trying to figure out the branching logic of which if statements are needed and in which order.
After you figure out the core logic of the problem, you can decide whether you’ll print() directly in the code:
This function is straightforward to use since it directly prints the strings. However, it’s not a pleasant function to test. This can be a useful trade-off. However, in coding interviews, the interviewer will sometimes ask you to write tests. Writing the structure first allows you to make sure you understand the logical flow before checking what the other requirements are.
An alternative would be to write a function that returns the string and then do the looping elsewhere:
This function pushes the printing functionality up the stack and is easier to test.
Figuring out the core conditionals and structure of the problem using pass makes it easier to decide exactly how the implementation should work later on.
This approach is also useful when writing classes. If you need to write a class to implement something, but you don’t fully understand the problem domain, then you can use pass to first understand the best layout for your code architecture.
For example, imagine you’re implementing a Candy class, but the properties you need aren’t obvious. Eventually you’ll need to conduct some careful requirement analysis, but while implementing the basic algorithms, you can make it obvious that the class isn’t ready yet:
This allows you to instantiate members of the class and pass them around without having to decide what properties are relevant to the class.
Commented Out Code
When you comment out code, it’s possible to invalidate the syntax by removing all code in a block. If you have an if … else condition, then it might be useful to comment out one of the branches:
In this example, expensive_computation() runs code that takes a long time, such as multiplying big arrays of numbers. While you’re debugging, you might need to temporarily comment out the expensive_computation() call.
For example, maybe you want to run this code against some problematic data and see why there are so many values that aren’t None by checking the logs for the description. Skipping the expensive computation for the valid values would speed up testing quite a bit.
However, this isn’t valid code:
In this example, the if branch doesn’t have any statements in it. Comments are stripped early in the parsing process, before the indentation is inspected to see where blocks begin and end.
In this case, adding a pass statement makes the code valid:
Now it’s possible to run the code, skip the expensive computation, and generate the logs with the useful information.
Partially commenting out code while troubleshooting behavior is useful in many cases. In a case like the example above, you might comment out code that takes a long time to process and isn’t the source of the problem.
Another situation in which you might want to comment out code while troubleshooting is when the commented-out code has an undesirable side effect, like sending an email or updating a counter.
Similarly, sometimes it’s useful to comment out a whole function while keeping the call. If you’re using a library that needs a callback, then you might write code like this:
This code calls get_data() and attaches a callback to the result.
It might be useful to have a test run that discards the data in order to make sure that the source is given correctly. However, this isn’t valid Python code:
Since the function has no statements in its block, Python can’t parse this code.
Once again, pass can help you:
This is valid Python code that will discard the data and help you confirm that the arguments are correct.
Markers for Debuggers
When you run code in a debugger, it’s possible to set a breakpoint in the code where the debugger will stop and allow you to inspect the program state before continuing.
When a test run triggers a breakpoint often, such as in a loop, there might be many instances where the program state isn’t interesting. To address this problem, many debuggers also allow a conditional breakpoint, a breakpoint that will trigger only when a condition is true. For example, you might set a breakpoint in a for loop that’s triggered only if a variable is None to see why this case isn’t handled correctly.
However, many debuggers allow you to set only a few basic conditions on your breakpoints, such as equality or maybe a size comparison. You might need a more complicated condition, such as checking that a string is a palindrome before breaking.
While the debugger might not be capable of checking for palindromes, Python can do so with minimal effort. You can take advantage of that functionality by having a do-nothing if statement and setting a breakpoint on the pass line:
Although the pass line doesn’t do anything, it makes it possible for you to set a breakpoint there. Now you can run this code in a debugger and break only on strings that are palindromes.
Empty Functions
In some cases, it may even be useful for you to include an empty function in the deployed version of your code. For example, a function in a library might expect a callback function to be passed in.
An even more common case is when your code defines a class that inherits from a class that expects a method to be overridden. However, in your specific case, you don’t need to do anything. Or perhaps the reason you’re overriding the code is to prevent an overridable method from doing anything.
In all those cases, you’ll need to write an empty function or method. Once again, the problem is that having no lines after the def line isn’t valid Python syntax:
This fails because a function, like other blocks, has to include at least one statement. To fix this problem, you can use pass :
Now that the function has a statement, even one that does nothing, it’s valid Python syntax.
As another example, imagine you have a function that expects a file-like object to write to. However, you want to call the function for another reason and would like to discard the output. You can use pass to write a class that discards all data:
Empty Classes
Sometimes you want to raise specific exceptions in your code because they have a specific recovery path. However, you want to make sure that those exceptions inherit from a general exception in case someone is catching the general exception. These exception classes have no behavior or data. They’re just markers.
In order to see the usefulness of a rich exception hierarchy, you can consider password rule checking. Before trying to change the password on a website, you want to test it locally for the rules it enforces:
Note: This example is purely to illustrate Python semantics and techniques. Research has shown that password complexity rules don’t increase security.
For more information, see the National Institute of Standards and Technology (NIST) guidelines and the research they’re based on.
Each of those errors should have its own exception. The following code implements those rules:
This function will raise an exception if the password doesn’t follow the specified rules. A more realistic example would note all the rules that haven’t been followed, but that’s beyond the scope of this tutorial.
You can use this function in a wrapper to print the exception in a nice way:
In this case, friendly_check() catches only InvalidPasswordError since other ValueError exceptions are probably bugs in the checker itself. It prints out the exception’s name and value, which shows the rule that wasn’t followed.
In some situations, your users might not care exactly which problems exist in the input. In that case, you would just want to catch ValueError :
In this code, all invalid input is treated the same since you don’t care what problems the credentials have.
Because of these differing use cases, check_password() needs all four exceptions:
Each of these exceptions describes a different rule being violated. In code that matches a string against more sophisticated rules, there might be many more of these, arranged in a complex structure.
Despite the need for four different classes, none of the classes has any behavior. The pass statement allows you to define all four classes quickly.
Marker Methods
Some methods in classes exist not to be called but to mark the class as somehow being associated with this method.
The Python standard library has the abc module. The name of the module stands for abstract base class. This module helps define classes that aren’t meant to be instantiated but rather serve as a common base for some other classes.
Nothing should ever instantiate the Origin class directly. Each request should come from either a LoggedIn origin or a NotLoggedIn origin. Here’s a minimalist implementation:
While a real Origin class would be more complicated, this example shows some of the basics. Origin.description() will never be called since all the subclasses must override it.
The methods in a Protocol are never called. They serve only to mark the types of needed methods:
Demonstrating how to use a Protocol like this in mypy isn’t relevant to the pass statement. But it is important to see that the body of the method has only the pass statement.
There are more examples of such markers being used outside the Python language and standard libraries. For example, they’re used in the zope.interface package to indicate interface methods and in automat to indicate inputs to a finite-state automaton.
In all these cases, classes need to have methods but never call them. Because of this, the body doesn’t matter. But since the body can’t be empty, you can use the pass statement to add a body.
Alternatives to pass
The pass statement isn’t the only way to do nothing in your code. It’s not even the shortest, as you’ll see later. It’s not even always the best or most Pythonic approach.
Any expression in Python is a valid statement, and every constant is a valid expression. So the following expressions all do nothing:
Docstrings
Even when a docstring isn’t mandatory, it’s often a good substitute for the pass statement in an empty block. You can modify some examples from earlier in this this tutorial to use a docstring instead of pass :
In all these cases, the docstring makes the code clearer. The docstring will also be visible when you use this code in the interactive interpreter and in IDEs, making it even more valuable.
Note: The docstrings above are brief because there are several classes and functions. A docstring meant for production would usually be more thorough.
One technical advantage of docstrings, especially for those functions or methods that never execute, is that they’re not marked as “uncovered” by test coverage checkers.
Ellipsis
The original use for Ellipsis was in creating multidimensional slices. However, it’s now also the recommended syntax to fill in a suite in a stub file:
This function not only does nothing, but it’s also in a file that the Python interpreter never evaluates.
Raise an Error
Permanent Uses of pass
Using pass in Exception Catching
Here’s a function that removes a file and doesn’t fail if the file doesn’t exist:
Because nothing needs to be done if a FileNotFoundError is raised, you can use pass to have a block with no other statements.
Note: It’s important to use caution when ignoring exceptions. An exception usually means that something unexpected has happened, and some recovery is needed. Before ignoring exceptions, think carefully about what could cause them.
Note that the pass statement will often be replaced by a logging statement. However, there’s no requirement to do this if the error is expected and well understood.
In this case, you could also use the context manager contextlib.suppress() to suppress the error. However, if you need to handle some errors while ignoring others, then it’s more straightforward to have an empty except class with nothing except the pass statement.
For example, if you wanted to have ensure_nonexistence() deal with directories as well as files, then you could use this approach:
Using pass in if … elif Chains
When you use long if … elif chains, sometimes you don’t need to do anything in one case. However, you can’t skip that elif because execution would continue through to the other condition.
Imagine that a recruiter gets tired of using the fizz-buzz challenge as an interview question and decides to ask it with a twist. This time, the rules are a bit different:
The interviewer believes that this new twist will make answers more interesting.
As with all coding interview questions, there are many ways to solve this challenge. But one way is to use a for loop with a chain that mimics the description above:
The if … elif chain mirrors the logic of moving to the next option only if the previous one did not take.
This use case for the pass statement allows you to avoid refactoring the logic and to keep the code arranged in a way that matches the description of the behavior.
Conclusion
You now understand what the Python pass statement does. You’re ready to use it to improve your development and debugging speed as well as to deploy it tactfully in your production code.
In this tutorial, you’ve learned:
Now you’ll be able to write better and more efficient code by knowing how to tell Python to do nothing.
Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team.
About Moshe Zadka
Moshe has been using Python since 1998. He has contributed to CPython, and is a founding member of the Twisted project. He has been teaching Python in various venues since 2002.
Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. The team members who worked on this tutorial are:
Master Real-World Python Skills With Unlimited Access to Real Python
Join us and get access to hundreds of tutorials, hands-on video courses, and a community of expert Pythonistas:
Master Real-World Python Skills
With Unlimited Access to Real Python
Join us and get access to hundreds of tutorials, hands-on video courses, and a community of expert Pythonistas:
Real Python Comment Policy: The most useful comments are those written with the goal of learning from or helping out other readers—after reading the whole article and all the earlier comments. Complaints and insults generally won’t make the cut here.
What’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment below and let us know.
Related Tutorial Categories: basics python