Я участвую в процессе обучения Python, и я дошел до раздела о pass
. Руководство, которое я использую, определяет его как оператор Null
, который обычно используется в качестве заполнителя.
Я до сих пор не совсем понимаю, что это значит. Может ли кто-нибудь показать мне простую/основную ситуацию, в которой будет использоваться оператор pass
и почему он необходим?
Ответ 1
Предположим, вы разрабатываете новый класс с некоторыми методами, которые пока не хотите реализовывать.
class MyClass(object):
def meth_a(self):
pass
def meth_b(self):
print "I'm meth_b"
Если бы вы pass
, код не запустился бы.
Затем вы получите:
IndentationError: expected an indented block
Подводя итог, можно сказать, что оператор pass
не делает ничего конкретного, но он может выступать в качестве заполнителя, как показано здесь.
Ответ 2
У Python есть синтаксическое требование, чтобы блоки кода (после if
, except
, def
, class
и т.д.) Не могли быть пустыми. Однако пустые кодовые блоки полезны в различных контекстах, например, в примерах ниже, которые являются наиболее частыми случаями использования, которые я видел.
Поэтому, если в кодовом блоке ничего не должно происходить, для такого блока не требуется pass
, чтобы не генерировать IndentationError
. В качестве альтернативы можно использовать любое утверждение (в том числе просто оцениваемый термин, например литерал Ellipsis
...
или строку, чаще всего строку документации), но pass
ясно дает понять, что в действительности ничего не должно происходить, и не требует фактической оценки и (хотя бы временного) сохранения в памяти.
Игнорирование (все или) определенного типа Exception
(пример из xml
):
try:
self.version = "Expat %d.%d.%d" % expat.version_info
except AttributeError:
pass # unknown
Примечание: Игнорирование всех типов повышений, как в следующем примере из pandas
, обычно считается плохой практикой, поскольку оно также отлавливает исключения, которые, вероятно, следует передать вызывающей стороне, например, KeyboardInterrupt
или SystemExit
(или даже HardwareIsOnFireError
- откуда вы знаете, что вы не запускаете пользовательский ящик с определенными конкретными ошибками, о которых некоторые вызывающие приложения хотели бы знать?).
try:
os.unlink(filename_larry)
except:
pass
Вместо использования хотя бы except Error:
или в этом случае предпочтительно except OSError:
считается гораздо лучшей практикой. Быстрый анализ всех модулей Python, которые я установил, показал, что более 10% всех операторов except ...: pass
перехватывают все исключения, поэтому это все еще частый шаблон в программировании на Python.
Вывод класса исключения, который не добавляет нового поведения (например, в scipy
):
class CompileError(Exception):
pass
Точно так же классы, предназначенные как абстрактный базовый класс, часто имеют явный пустой __init__
или другие методы, которые должны наследовать подклассы. (например, pebl
)
class _BaseSubmittingController(_BaseController):
def submit(self, tasks): pass
def retrieve(self, deferred_results): pass
Тестирование этого кода выполняется правильно для нескольких тестовых значений, не заботясь о результатах (из mpmath
):
for x, error in MDNewton(mp, f, (1,-2), verbose=0,
norm=lambda x: norm(x, inf)):
pass
В определениях классов или функций часто строка документа уже существует в качестве обязательного оператора, выполняемого как единственная вещь в блоке. В таких случаях блок может содержать pass
в дополнение к строке документации, чтобы сказать "Это действительно предназначено для того, чтобы ничего не делать", например, в pebl
:
class ParsingError(Exception):
"""Error encountered while parsing an ill-formed datafile."""
pass
В некоторых случаях pass
используется в качестве заполнителя, чтобы сказать: "Этот метод/класс/if-block/... еще не был реализован, но это будет место для этого", хотя я лично предпочитаю Ellipsis
литерал ...
для того, чтобы строго разграничить это и преднамеренное 'no-op' в предыдущем примере. (Обратите внимание, что литерал Ellipsis является допустимым выражением только в Python 3)
Например, если я напишу модель широкими штрихами, я мог бы написать
def update_agent(agent):
...
где другие могут иметь
def update_agent(agent):
pass
перед тем
def time_step(agents):
for agent in agents:
update_agent(agent)
как напоминание о необходимости заполнить функцию update_agent
на более позднем этапе, но уже запустите некоторые тесты, чтобы увидеть, ведет ли остальная часть кода, как задумано. (Третий вариант для этого случая - raise NotImplementedError
. Это полезно, в частности, для двух случаев: либо "Этот абстрактный метод должен быть реализован каждым подклассом, нет универсального способа определить его в этом базовом классе", либо "Этот функция с таким именем еще не реализована в этом выпуске, но именно так будет выглядеть ее подпись ')
Ответ 3
Помимо использования в качестве заполнителя для нереализованных функций, pass
может быть полезным при заполнении инструкции if-else ( "Явный лучше, чем неявный" ).
def some_silly_transform(n):
# Even numbers should be divided by 2
if n % 2 == 0:
n /= 2
flag = True
# Negative odd numbers should return their absolute value
elif n < 0:
n = -n
flag = True
# Otherwise, number should remain unchanged
else:
pass
Конечно, в этом случае можно было бы использовать return
вместо назначения, но в тех случаях, когда требуется мутация, это лучше всего работает.
Использование pass
здесь особенно полезно для предупреждения будущих сопровождающих (включая вас самих!), чтобы не делать лишние шаги за пределами условных операторов. В приведенном выше примере flag
устанавливается в двух специально указанных случаях, но не в else
-case. Без использования pass
будущий программист может перемещать flag = True
за пределы условия, тем самым устанавливая flag
во всех случаях.
Другой случай заключается в том, что функция шаблона часто видна в нижней части файла:
if __name__ == "__main__":
pass
В некоторых файлах было бы неплохо оставить это там с pass
, чтобы упростить редактирование позже, и сделать явным, что ничего не ожидается, когда файл запускается сам по себе.
Наконец, как упоминалось в других ответах, при сбое исключения может быть полезно ничего не делать:
try:
n[i] = 0
except IndexError:
pass
Ответ 4
Самый лучший и самый точный способ думать о pass
- это способ явного указания интерпретатору ничего не делать. Аналогичным образом следующий код:
def foo(x,y):
return x+y
означает "если я вызываю функцию foo (x, y), суммируем два числа, которые обозначают метки x и y, и возвращают результат",
def bar():
pass
означает "Если я вызываю функциональную панель(), ничего не делаю".
Другие ответы вполне правильны, но это также полезно для нескольких вещей, которые не связаны с размещением.
Например, в немного кода, с которым я работал совсем недавно, необходимо было разделить две переменные, и было возможно, что делитель будет равен нулю.
c = a / b
будет, очевидно, производить ZeroDivisionError, если b равно нулю. В этой конкретной ситуации оставление c как нуля было желательным поведением в случае, когда b был равен нулю, поэтому я использовал следующий код:
try:
c = a / b
except ZeroDivisionError:
pass
Другое, менее стандартное использование - это удобное место для установки точки останова для вашего отладчика. Например, я хотел немного кода, чтобы прорваться в отладчик на 20-й итерации инструкции for... in. Итак:
for t in range(25):
do_a_thing(t)
if t == 20:
pass
с точкой останова на проходе.
Ответ 5
Общим вариантом использования, который можно использовать как "как есть", является переопределение класса только для создания типа (который в остальном совпадает с суперклассом), например
class Error(Exception):
pass
Таким образом, вы можете поднимать и ловить Error
исключения. Здесь важно исключение, а не контент.
Ответ 6
если вы не знаете, что собираетесь поместить в определенный блок кода
try:
int(someuserinput)
except ValueError:
pass
Мне нравится использовать его при тестировании тестов. Я часто вспоминаю, что я мог бы опробовать, но не знаю, как это сделать. Пример тестирования выглядит так, как предположил sebastian_oe
class TestFunctions(unittest.TestCase):
def test_some_feature(self):
pass
def test_some_other_feature(self):
pass
Ответ 7
pass
в Python в принципе ничего не делает, но в отличие от комментария он не игнорируется интерпретатором. Таким образом, вы можете воспользоваться им во многих местах, сделав его владельцем места:
1: Может использоваться в классе
class TestClass:
pass
2: Может использоваться в циклах и условных операторах:
if (something == true): # used in conditional statement
pass
while (some condition is true): # user is not sure about the body of the loop
pass
3: Может использоваться в функции:
def testFunction(args): # programmer wants to implement the body of the function later
pass
pass
в основном используется, когда программист не хочет давать реализацию на данный момент, но все же хочет создать определенный оператор класса/функции/условного выражения, который может быть использован позже. Поскольку интерпретатор Python не допускает пустой или невыполненный оператор class/function/conditional, он дает ошибку:
IndentationError: ожидается отложенный блок
pass
может использоваться в таких сценариях.
Ответ 8
Вы можете сказать, что проход означает NOP (без операции). После этого примера вы получите четкое изображение: -
Программа C
#include<stdio.h>
void main()
{
int age = 12;
if( age < 18 )
{
printf("You are not adult, so you can't do that task ");
}
else if( age >= 18 && age < 60)
{
// I will add more code later inside it
}
else
{
printf("You are too old to do anything , sorry ");
}
}
Теперь, как вы напишете это в Python: -
age = 12
if age < 18:
print "You are not adult, so you can't do that task"
elif age >= 18 and age < 60:
else:
print "You are too old to do anything , sorry "
Но ваш код даст ошибку, потому что для него требуется отложенный блок после elif. Вот роль ключевого слова передать.
age = 12
if age < 18:
print "You are not adult, so you can't do that task"
elif age >= 18 and age < 60:
pass
else:
print "You are too old to do anything , sorry "
Теперь я думаю, что это ясно для вас.
Ответ 9
Честно говоря, я думаю, что официальные документы Python описывают его довольно хорошо и приводят несколько примеров:
Пропускная инструкция ничего не делает. Его можно использовать, когда инструкция требуется синтаксически, но программа не требует никаких действий. Например:
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
Это обычно используется для создания минимальных классов:
>>> class MyEmptyClass:
... pass
...
Еще один пропуск места может использоваться как владелец места для функции или условного тела, когда вы работаете над новым кодом, позволяя вам продолжать думать на более абстрактном уровне. Пропуск молча игнорируется:
>>> def initlog(*args):
... pass # Remember to implement this!
...
Ответ 10
Пропускная инструкция ничего не делает. Он может использоваться, когда оператор требуется синтаксически, но программа не требует действий.
Ответ 11
как сказано в книге, я использую ее только как временное местозаполнитель, т.е.
# code that does something to to a variable, var
if var == 2000:
pass
else:
var += 1
а затем заполните сценарий, в котором var == 2000
Ответ 12
Pass ссылается на ignore.... так просто, как есть.... если заданное условие истинно и следующий оператор - pass, он игнорирует это значение или итерацию и переходит к следующей строке..... Пример
For i in range (1,100):
If i%2==0:
Pass
Else:
Print(i)
Вывод: печатает все нечетные числа от 1 до 100
Это связано с тем, что модуль четного числа равен нулю, следовательно, он игнорирует число и переходит к следующему числу, поскольку модуль нечетных чисел не равен нулю, остальная часть цикла выполняется и печатается
Ответ 13
Вот пример, когда я извлекал определенные данные из списка, где у меня было несколько типов данных (это то, что я бы назвал в R - извините, если это неправильная номенклатура), и я хотел извлечь только целые числа/числовые и НЕ символьные данные.
Данные выглядели так:
>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>
Я хотел удалить все алфавитные символы, поэтому я сделал это машиной, подмножая данные и "пропуская" по алфавитным данным:
a = ['1', 'env', '2', 'gag', '1.234', 'nef']
data = []
for i in range(0, len(a)):
if a[i].isalpha():
pass
else:
data.append(a[i])
print(data)
['1', '2', '1.234']
Ответ 14
Заявление о пропуске в Python используется, когда инструкция требуется синтаксически, но вы не хотите, чтобы какая-либо команда или код выполнялись.
Оператор pass - это нулевая операция; ничего не происходит, когда оно выполняется. Проход также полезен в тех местах, где ваш код в конечном итоге уйдет, но еще не написан (например, в заглушках):
`Пример:
#!/usr/bin/python
for letter in 'Python':
if letter == 'h':
pass
print 'This is pass block'
print 'Current Letter :', letter
print "Good bye!"
Это приведет к следующему результату:
Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!
Предыдущий код не выполняет никакой инструкции или код, если значение буквы "h". Инструкция pass полезна, когда вы создали блок кода, но он больше не требуется.
Затем вы можете удалить операторы внутри блока, но пусть блок останется с инструкцией pass, чтобы он не мешал другим частям кода.
Ответ 15
pass используется, чтобы избежать ошибок отступов в python. Если мы возьмем такие языки, как c, c++, java, у них есть такие скобки, как
if(i==0)
{}
else
{//some code}
Но в python он использовал отступы вместо фигурных скобок, поэтому, чтобы избежать таких ошибок, мы используем pass. Помните, как вы играли в викторину и
if(dont_know_the_answer)
pass
Пример программы,
for letter in 'geeksforgeeks':
pass
print 'Last Letter :', letter