Как использовать пароль?

Я участвую в процессе обучения 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