Jak korzystać z instrukcji pass?

392

Jestem w trakcie nauki języka Python i dotarłem do sekcji o tym passstwierdzeniu. Przewodnik, którego używam, definiuje go jako Nullinstrukcję, która jest powszechnie używana jako symbol zastępczy.

Nadal jednak nie do końca rozumiem, co to znaczy. Czy ktoś może mi pokazać prostą / podstawową sytuację, w której passoświadczenie byłoby użyte i dlaczego jest potrzebne?

Capurnicus
źródło
4
Nigdy nie musiałem tego robić w prawdziwym życiu, ale przypuszczam, passże przydałoby się, gdy chcesz zastąpić metodę w podklasie, aby nic nie robić.
kojiro
2
@kojiro, np. czasami przydatny podczas robienia en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt
1
Bardzo przydatny przy przetwarzaniu wyjątków. Czasami wyjątek oznacza normalny stan, który wymaga tylko innego rodzaju przetwarzania. W takim przypadku passw exceptbloku jest bardzo przydatna.
Szalony fizyk

Odpowiedzi:

474

Załóżmy, że projektujesz nową klasę za pomocą metod, których jeszcze nie chcesz wdrożyć.

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

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

Jeśli pominiesz passkod, kod nie uruchomi się.

Otrzymasz wtedy:

IndentationError: expected an indented block

Podsumowując, passoświadczenie nie robi nic szczególnego, ale może działać jako symbol zastępczy, jak pokazano tutaj.

sebastian_oe
źródło
22
Cóż, w tym przypadku można również użyć return, choć z niewielką utratą przejrzystości.
38
Naprawdę nie sądzę, że to właściwie odpowiada na pytanie. Przywołanie jednego możliwego zastosowania do czegoś, nawet jeśli jest to najczęstsze użycie, nie jest tym samym, co wyjaśnienie, do czego to służy.
Schilcote,
5
@Schilcote: Rozumiem twój punkt widzenia. Do mojej pierwotnej odpowiedzi dodałem kolejne krótkie wyjaśnienie. Myślę jednak, że prosty przykład często pomaga zrozumieć określoną koncepcję.
sebastian_oe
3
Odpowiedź @Anaphory poniżej pokazuje, dlaczego jest to ważny element języka.
John
2
To wyjaśnia jedno zastosowanie pass, ale nadal nie rozumiem, co to robi. Czy ma to zastosowanie w kodzie produkcyjnym? W twoim przykładzie wolałbym nie dodawać tej metody, dopóki nie będę gotowy do jej wdrożenia, lub po prostu zrobię to return.
theUtherSide
221

Python ma syntaktyczną wymóg, że bloki kodu (po if, except, def, classitd.) Nie mogą być puste. Puste bloki kodu są jednak przydatne w różnych kontekstach, na przykład w poniższych przykładach, które są najczęstszymi przypadkami użycia, jakie widziałem.

Dlatego, jeśli nic nie ma się wydarzyć w bloku kodu, passpotrzebny jest a , aby taki blok nie wygenerował IndentationError. Alternatywnie można zastosować dowolne stwierdzenie (w tym tylko termin do oceny, taki jak Ellipsisliterał ...lub ciąg, najczęściej dokumentacja), ale passwyjaśnia, że ​​rzeczywiście nic się nie powinno zdarzyć i nie trzeba go tak naprawdę oceniać i (przynajmniej tymczasowo) przechowywane w pamięci.

  • Ignorowanie (wszystkie lub) określonego rodzaju Exception(przykład z xml):

    try:
        self.version = "Expat %d.%d.%d" % expat.version_info
    except AttributeError:
        pass # unknown

    Uwaga: Ignorowanie wszystkich rodzajów podwyżek, jak w poniższym przykładzie pandas, jest ogólnie uważane za złą praktykę, ponieważ wychwytuje również wyjątki, które prawdopodobnie powinny zostać przekazane do dzwoniącego, np. KeyboardInterruptLub SystemExit(a nawet HardwareIsOnFireError- Skąd wiesz, że nie jesteś działający na niestandardowym polu ze zdefiniowanymi konkretnymi błędami, o których niektóre aplikacje dzwoniące chcieliby wiedzieć?).

    try:
        os.unlink(filename_larry)
    except:
        pass

    Zamiast tego stosowanie przynajmniej except Error:lub w tym przypadku najlepiej except OSError:jest uważane za znacznie lepszą praktykę. Szybka analiza wszystkich modułów Pythona, które zainstalowałem, dała mi do except ...: passzrozumienia, że ponad 10% wszystkich instrukcji przechwytuje wszystkie wyjątki, więc nadal jest to częsty wzorzec w programowaniu w Pythonie.

  • Wyprowadzanie klasy wyjątku, która nie dodaje nowego zachowania (np. In scipy):

    class CompileError(Exception):
        pass

    Podobnie, klasy zaprojektowane jako abstrakcyjna klasa podstawowa często mają jawnie puste __init__lub inne metody, które powinny być wyodrębnione w podklasach. (np. pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • Testowanie tego kodu działa poprawnie dla kilku wartości testowych, bez dbania o wyniki (z mpmath):

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • W definicjach klas lub funkcji często istnieje już dokumentacja jako obowiązkowa instrukcja, którą należy wykonać jako jedyną w bloku. W takich przypadkach blok może zawierać pass oprócz docstring, aby powiedzieć „To naprawdę nie ma zamiaru nic robić”, na przykład w pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • W niektórych przypadkach passjest używany jako symbol zastępczy, aby powiedzieć „Ta metoda / klasa / if-block / ... nie została jeszcze zaimplementowana, ale będzie to miejsce, w którym można to zrobić”, chociaż osobiście wolę Ellipsisliterał ..., aby dokładnie rozróżnij to od celowego „braku op” w poprzednim przykładzie. ( Zauważ, że literał Ellipsis jest poprawnym wyrażeniem tylko w Pythonie 3 )
    Na przykład, jeśli piszę model szerokimi pociągnięciami, mogę napisać

    def update_agent(agent):
        ... 

    gdzie inni mogą mieć

    def update_agent(agent):
        pass

    przed

    def time_step(agents):
        for agent in agents:
            update_agent(agent)

    jako przypomnienie o wypełnieniu update_agentfunkcji w późniejszym czasie, ale uruchom już kilka testów, aby sprawdzić, czy reszta kodu zachowuje się zgodnie z przeznaczeniem. (Trzecią opcją w tym przypadku jest raise NotImplementedError. Jest to przydatne w szczególności w dwóch przypadkach: Albo „Ta abstrakcyjna metoda powinna zostać zaimplementowana przez każdą podklasę, nie ma ogólnego sposobu jej zdefiniowania w tej klasie bazowej” , albo „Ta funkcja z ta nazwa nie jest jeszcze zaimplementowana w tej wersji, ale tak będzie wyglądać jej podpis ” )

Anafora
źródło
To zdecydowanie lepsza odpowiedź!
rjoxford
22

Oprócz użycia jako symbolu zastępczego dla niezaimplementowanych funkcji, passmoże być przydatny w wypełnianiu instrukcji if-else („Jawne jest lepsze niż niejawne”).

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

Oczywiście w tym przypadku prawdopodobnie użyłbyś returnzamiast przypisania, ale w przypadkach, w których pożądana jest mutacja, działa to najlepiej.

Użycie passtutaj jest szczególnie przydatne, aby ostrzec przyszłych opiekunów (w tym ciebie!), Aby nie umieszczali zbędnych kroków poza instrukcjami warunkowymi. W powyższym przykładzie flagjest ustawiony w dwóch konkretnie wymienionych przypadkach, ale nie w- elsecase. Bez użycia passprzyszły programista może wyjść flag = Truepoza ten warunek - w ten sposób ustawiając flagwe wszystkich przypadkach.


Innym przypadkiem jest funkcja płyty kotłowej często widywana na dole pliku:

if __name__ == "__main__":
    pass

W niektórych plikach warto pozostawić tę opcję, passaby ułatwić późniejszą edycję i wyjaśnić, że nic się nie dzieje, gdy plik jest uruchamiany samodzielnie.


Wreszcie, jak wspomniano w innych odpowiedziach, przydatne może być nic nie robić, gdy zostanie wychwycony wyjątek:

try:
    n[i] = 0
except IndexError:
    pass
Micah Walter
źródło
2
Myślę, że dwa pierwsze przykłady to ogólnie zła praktyka. Jeśli chodzi o pierwszy przykład, powinieneś ustawić flag = Falseprzed if ... elif blokiem, aby zapobiec późniejszym niejasnym błędom „Błąd nazwy: nazwa flagi nie jest zdefiniowana”. Jeśli chodzi o drugi przykład, wydaje się, że bizzar musi dodać if __name__ == "__main__": passdo większości plików Pythona, które nie wykonują niczego, gdy są wykonywane bezpośrednio (co ma miejsce w przypadku pisania kodu modułowego). W Pythonie> = 3.0 powinieneś używać ...(Ellipsis) zamiast passoznaczać bloki „kończ później”.
ostrokach
18

Najlepszym i najdokładniejszym sposobem myślenia passjest sposób, aby wyraźnie powiedzieć tłumaczowi, aby nic nie robił. W ten sam sposób następujący kod:

def foo(x,y):
    return x+y

oznacza „jeśli wywołam funkcję foo (x, y), zsumuj dwie liczby, które reprezentują etykiety xiy i przekaż wynik”,

def bar():
    pass

oznacza „Jeśli wywołam funkcję bar (), nie rób absolutnie nic”.

Pozostałe odpowiedzi są całkiem poprawne, ale przydają się również w przypadku kilku rzeczy, które nie wymagają trzymania miejsca.

Na przykład w odrobinie kodu, nad którym niedawno pracowałem, konieczne było podzielenie dwóch zmiennych, a dzielnik mógł mieć wartość zero.

c = a / b

wytworzy oczywiście ZeroDivisionError, jeśli b wynosi zero. W tej konkretnej sytuacji pozostawienie c jako zera było pożądanym zachowaniem w przypadku, gdy b było zerem, więc użyłem następującego kodu:

try:
    c = a / b
except ZeroDivisionError:
    pass

Innym, mniej standardowym sposobem użycia jest przydatne miejsce do ustawienia punktu przerwania dla debuggera. Na przykład chciałem, aby trochę kodu włamało się do debuggera podczas dwudziestej iteracji instrukcji for ... in. Więc:

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

z punktem przerwania przy przejściu.

Schilcote
źródło
def bar(): passnie robi „absolutnie nic”. Nadal powraca None, domyślnie.
chepner
1
Twoje zdanie na temat debuggera jest często pomijane, ale ważne. +1
Wtower
10

Typowym przypadkiem użycia, w którym można go używać „tak jak jest”, jest zastąpienie klasy tylko w celu utworzenia typu (który w przeciwnym razie jest taki sam jak nadklasa), np.

class Error(Exception):
    pass

Możesz więc wychowywać i wychwytywać Errorwyjątki. Liczy się tutaj wyjątek, a nie treść.


źródło
6

passw Pythonie w zasadzie nic nie robi, ale w przeciwieństwie do komentarza nie jest ignorowane przez interpretera. Możesz więc z niego skorzystać w wielu miejscach, ustawiając go na miejsce:

1: Może być stosowany w klasie

   class TestClass: 
      pass

2: Można używać w pętli i instrukcjach warunkowych:

   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: Może być użyty w funkcji:

   def testFunction(args): # programmer wants to implement the body of the function later
       pass

passjest najczęściej używany, gdy programista nie chce w tej chwili podać implementacji, ale nadal chce utworzyć pewną instrukcję klasy / funkcji / warunkową, z której można będzie później skorzystać. Ponieważ interpreter języka Python nie zezwala na pustą lub niezaimplementowaną instrukcję class / function / conditional, pojawia się błąd:

IndentationError: oczekiwany blok wcięcia

pass może być stosowany w takich scenariuszach.

Arijit
źródło
5

Można powiedzieć, że podanie oznacza operację NOP (brak operacji). Otrzymasz wyraźny obraz po tym przykładzie: -

Program 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 ");
    }
}

Teraz, jak napiszesz to w Pythonie: -

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 "

Ale twój kod da błąd, ponieważ wymagał wcięcia po elifie . Oto rola słowa kluczowego pass .

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 "

Teraz myślę, że to dla ciebie jasne.

Deepak Dixit
źródło
1
&&operator nie istnieje w Pythonie
Iván C.
5

Lubię go używać podczas testowania. Często zdaję sobie sprawę z tego, co chciałbym przetestować, ale nie bardzo wiem, jak to zrobić. Przykład testowy wygląda tak, jak sugerował sebastian_oe

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
dm03514
źródło
Zdecydowanie NIE zalecam tego, abyś mógł łatwo zapomnieć o tak pustym teście! Lepiej testów stub z zawsze upaść krótkie kody, np assert Falsealbo assert 0w ten sposób zawsze będziesz zauważyć należy dodać realizację :)
jave.web
4

Instrukcja pass nic nie robi. Można go użyć, gdy instrukcja jest wymagana składniowo, ale program nie wymaga działania.

Harsha Biyani
źródło
4

Szczerze mówiąc, myślę, że oficjalne dokumenty Pythona opisują to całkiem dobrze i podają kilka przykładów:

Instrukcja pass nic nie robi. Można go użyć, gdy instrukcja jest wymagana składniowo, ale program nie wymaga działania. Na przykład:

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

Jest to powszechnie używane do tworzenia minimalnych klas:

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

Kolejną przepustką miejsca może być miejsce na miejsce dla funkcji lub ciała warunkowego podczas pracy nad nowym kodem, pozwalając ci myśleć w bardziej abstrakcyjny sposób. Karnet jest ignorowana:

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

Usagi
źródło
0

jak napisano w książce, używam go tylko jako tymczasowego symbolu zastępczego, tj.

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

a następnie wypełnij scenariusz, w którym var == 2000

Cameron Sparr
źródło
3
o jakiej książce mówisz?
przepraszam ... przewodnik, że OP wspomina
Cameron Sparr
0

Przekazanie odnosi się do zignorowania .... tak proste, jak to jest ... jeśli podany warunek jest spełniony, a następna instrukcja jest zaliczona, ignoruje tę wartość lub iterację i przechodzi do następnego wiersza ..... Przykład

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

Wyjście: Drukuje wszystkie nieparzyste liczby od 1-100

Wynika to z faktu, że moduł liczby parzystej jest równy zeru, dlatego ignoruje liczbę i przechodzi do następnej liczby, ponieważ moduł liczb nieparzystych nie jest równy zeru, inna część pętli jest wykonywana i drukowana

Spłukać
źródło
Dostaję SyntaxError. Nie jest to również dobre zastosowanie, passponieważ można po prostu to zrobićfor i in range(1,100):print(i)if i%2else""
MilkyWay90
-1

Oto przykład, w którym wyodrębniałem określone dane z listy, na której miałem wiele typów danych (tak to nazwałbym w R - przepraszam, jeśli jest to niewłaściwa nomenklatura) i chciałem wyodrębnić tylko liczby całkowite / numeryczne, a NIE dane znakowe .

Dane wyglądały następująco:

>>> a = ['1', 'env', '2', 'gag', '1.234', 'nef']
>>> data = []
>>> type(a)
<class 'list'>
>>> type(a[1])
<class 'str'>
>>> type(a[0])
<class 'str'>

Chciałem usunąć wszystkie znaki alfabetyczne, więc kazałem maszynie to zrobić, dzieląc dane i „przekazując” dane alfabetyczne:

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']
Edward Tyler
źródło
-1

Instrukcja pass w Pythonie jest używana, gdy instrukcja jest wymagana składniowo, ale nie chcesz, aby komenda lub kod były wykonywane.

Instrukcja pass jest operacją zerową; nic się nie dzieje, gdy się wykonuje. Przełęcz jest również przydatna w miejscach, w których twój kod ostatecznie przejdzie, ale nie został jeszcze napisany (np. W kodach pośrednich):

`Przykład:

#!/usr/bin/python

for letter in 'Python': 
   if letter == 'h':
      pass
      print 'This is pass block'
   print 'Current Letter :', letter

print "Good bye!"

Spowoduje to następujący wynik:

Current Letter : P
Current Letter : y
Current Letter : t
This is pass block
Current Letter : h
Current Letter : o
Current Letter : n
Good bye!

Poprzedni kod nie wykonuje żadnej instrukcji ani kodu, jeśli wartość litery to „h”. Instrukcja pass jest pomocna po utworzeniu bloku kodu, ale nie jest już wymagana.

Następnie możesz usunąć instrukcje wewnątrz bloku, ale niech blok pozostanie z instrukcją pass, aby nie zakłócała ​​innych części kodu.

MKDHEERAJ
źródło
-1

pass służy do uniknięcia błędu wcięcia w pythonie Jeśli weźmiemy języki takie jak c, c ++, java, mają one nawiasy klamrowe jak

 if(i==0)
 {}
 else
 {//some code}

Ale w pythonie używał wcięcia zamiast nawiasów klamrowych, więc aby uniknąć takich błędów, używamy pass. Pamiętam, jak grałeś w quiz i

 if(dont_know_the_answer)
      pass

Przykładowy program,

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
Ganesh Chowdhary Sadanala
źródło