Як використовувати оператор пропуску?


392

Я зараз вивчаю Python, і я дійшов до розділу про passтвердження. Посібник, який я використовую, визначає це як Nullзаяву, яке зазвичай використовується як заповнювач.

Я все ще не повністю розумію, що це означає. Чи може хтось показати мені просту / базову ситуацію, де passвисловлювання буде використано та навіщо воно потрібне?


4
Мені ніколи не потрібно було цього робити в реальному житті, але я можу припустити, що passце буде корисно, коли ви хочете замінити метод у підкласі, щоб нічого не робити.
kojiro

2
@kojiro, наприклад, іноді корисно робити en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt,

1
Дуже зручно при обробці винятків. Іноді виняток означає нормальний стан, який просто вимагає іншого виду обробки. У цьому випадку passв exceptблоці дуже зручно.
Божевільний фізик

Відповіді:


474

Припустимо, ви розробляєте новий клас деякими методами, які ще не хочете реалізувати.

class MyClass(object):
    def meth_a(self):
        pass

    def meth_b(self):
        print "I'm meth_b"

Якби ви не залишилися pass, код не запустився.

Потім ви отримаєте:

IndentationError: expected an indented block

Підводячи підсумок, passзаява не робить нічого особливого, але може виступати як заповнювач, як показано тут.


22
Ну, і в цьому випадку можна було б скористатися return, хоча з невеликою втратою ясності.

38
Я дійсно не думаю, що це належним чином відповідає на питання. Посилання на одне можливе використання для чогось, навіть якщо це є найбільш поширеним для нього використання, не те саме, що пояснювати, для чого це потрібно.
Schilcote

5
@Schilcote: Я бачу вашу думку. Я додав ще одне коротке пояснення до своєї первинної відповіді. Однак я думаю, що простий приклад часто допомагає зрозуміти певне поняття.
sebastian_oe

3
Відповідь @Anaphory нижче показана, чому це важливий мовний елемент.
Джон

2
Це пояснює одне використання pass, але я все ще не розумію, що це робить. Чи є для цього використання у виробничому коді? З вашого прикладу я б вирішив просто не додавати цей метод, поки я не буду його реалізовувати, або я просто зроблю це return.
thetherSide

221

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 на додаток до docstring для того, щоб сказати "Це дійсно призначено не робити нічого", наприклад у pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
    
  • У деяких випадках passвикористовується як заповнювач, щоб сказати "Цей метод / клас / if-block / ... ще не був реалізований, але це буде місце це зробити", хоча я особисто віддаю перевагу Ellipsisбуквальному ...для того, щоб в попередньому прикладі суворо розмежовувати це та навмисне «неоперацію». ( Зверніть увагу, що літерал 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. Це корисно, зокрема, для двох випадків: або "Цей абстрактний метод повинен бути реалізований кожним підкласом, немає загального способу його визначення в цьому базовому класі" , або "Ця функція, з ця назва ще не реалізована у цьому випуску, але ось як виглядатиме її підпис » )


Це набагато краща відповідь!
rjoxford

22

Крім того, його використання в якості заповнювача для нездійснених функцій 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. Без використання passмайбутній програміст може переходити flag = Trueдо поза умови - таким чином встановлюючи flagв усіх випадках.


Інший випадок - функція котла, яку часто можна побачити внизу файлу:

if __name__ == "__main__":
    pass

У деяких файлах може бути непогано залишити це, passщоб потім було полегшене редагування, і зробити явне, що нічого не очікується, коли файл запускається самостійно.


Нарешті, як згадується в інших відповідях, корисно нічого не робити, коли трапляється виняток:

try:
    n[i] = 0
except IndexError:
    pass

2
Я думаю, що перші два приклади - це взагалі погана практика. Щодо першого прикладу, вам слід встановити flag = Falseперед if ... elif блоком, щоб уникнути незрозумілих помилок "NameError: ім'я 'flag' не визначено". Що стосується другого прикладу, то, здається, химерним є додавання if __name__ == "__main__": passдо більшості файлів Python, які не виконують нічого, якщо вони безпосередньо виконуються (що є випадком, коли ви пишете модульний код). З Python> = 3.0, ви повинні використовувати ...(Ellipsis) замість passпозначення блоків "закінчити пізніше".
ostrokach

18

Найкращий і найточніший спосіб подумати 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 ... у. Тому:

for t in range(25):
    do_a_thing(t)
    if t == 20:
        pass

з точкою розриву на пропуску.


def bar(): passне робить "абсолютно нічого". Він все одно повертається Noneнеявно.
чепнер

1
Ваша думка щодо налагоджувача часто не помічається, але важлива. +1
Wtower

10

Загальний випадок використання, коли він може бути використаний "як є", - це перекриття класу просто для створення типу (який інакше такий же, як і суперклас), наприклад

class Error(Exception):
    pass

Таким чином, ви можете збирати та виловлювати Errorвинятки. Тут важливий тип виключення, а не зміст.


6

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 не допускає пустого або неперевершеного оператора класу / функції / умовного умови, він видає помилку:

IndentationError: очікуваний відступний блок

pass може використовуватися в таких сценаріях.


5

Можна сказати, що пропуск означає операцію NOP (No Operation). Ви отримаєте чітку картину після цього прикладу: -

Програма 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 "

Тепер я думаю, що вам це зрозуміло.


1
&&оператора не існує в Python
Iván C.

5

Мені подобається використовувати його під час заглушки тестів. Я часто раз усвідомлюю те, що хотів би протестувати, але не знаю, як це зробити. Приклад тестування виглядає так, як запропонував sebastian_oe

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass

Я настійно рекомендую НЕ робити цього, ви можете легко забути про такий порожній тест! краще недопалок тести з завжди збанкрутувати короткі коди , наприклад , assert Falseабо assert 0таким чином , ви завжди будете відзначити , ви повинні додати реалізацію :)
jave.web

4

Заява проходу нічого не робить. Його можна використовувати, коли оператор потрібен синтаксично, але програма не вимагає ніяких дій.


4

Чесно кажучи, я думаю, що офіційні документи Python досить добре описують це і наводять кілька прикладів:

Заява проходу нічого не робить. Його можна використовувати, коли оператор потрібен синтаксично, але програма не вимагає ніяких дій. Наприклад:

>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...

Зазвичай це використовується для створення мінімальних класів:

>>> class MyEmptyClass: ... pass ...

Інший пропуск на місце, який можна використовувати, - це як розміщення місця для функції або умовного тіла, коли ви працюєте над новим кодом, що дозволяє продовжувати думати на більш абстрактному рівні. Прохід мовчки ігнорується:

>>> def initlog(*args): ... pass # Remember to implement this! ...


0

як сказано в книзі, я лише коли-небудь використовую її як тимчасовий заповнювач, тобто

# code that does something to to a variable, var
if var == 2000:
    pass
else:
    var += 1

а потім пізніше заповніть сценарій де var == 2000


3
про яку книжку ти говориш?

вибачте ... керівництво, що в ОП згадується
Камерон Спарр

0

Pass посилається на ігнорування .... настільки ж просто, як це .... якщо дана умова є істинним, а наступне твердження передається, воно ігнорує це значення або ітерацію та переходить до наступного рядка ..... Приклад

For i in range (1,100):
    If i%2==0:
                  Pass 
    Else:
                  Print(i)

Вихід: друкує всі непарні числа від 1-100

Це тому, що модуль парного числа дорівнює нулю, отже, він ігнорує число і переходить до наступного числа, оскільки модуль непарних чисел не дорівнює нулю, виконується частина останнього циклу та його друкується


Я отримую SyntaxError. Крім того, це не дуже корисно, passтому що ви могли просто зробитиfor i in range(1,100):print(i)if i%2else""
MilkyWay90,

-1

Ось приклад, коли я вилучав конкретні дані зі списку, де у мене було декілька типів даних (саме так я би назвав це в 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']

-1

Оператор пропуску в Python використовується, коли оператор потрібен синтаксично, але ви не хочете виконувати жодну команду чи код.

Заява проходу - це нульова операція; нічого не відбувається, коли воно виконується. Пропуск також корисний у тих місцях, де з часом ваш код піде, але він ще не був написаний (наприклад, у заглушках, наприклад):

`Приклад:

#!/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". Заява проходу корисна, коли ви створили блок коду, але він більше не потрібен.

Потім ви можете видалити оператори всередині блоку, але нехай цей блок залишається з оператором пропуску, щоб він не заважав іншим частинам коду.


-1

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.