Wie verwende ich die pass-Anweisung?

392

Ich bin gerade dabei, Python zu lernen und habe den Abschnitt über die passAussage erreicht. Der Leitfaden, den ich verwende, definiert ihn als eine NullAnweisung, die üblicherweise als Platzhalter verwendet wird.

Ich verstehe immer noch nicht ganz, was das bedeutet. Kann mir jemand eine einfache / grundlegende Situation zeigen, in der die passAussage verwendet wird und warum sie benötigt wird?

Capurnicus
quelle
4
Ich musste dies im wirklichen Leben nie tun, aber ich könnte annehmen, passdass es nützlich wäre, wenn Sie eine Methode in einer Unterklasse überschreiben möchten, um nichts zu tun.
Kojiro
2
@ Kojiro zB manchmal nützlich, wenn en.wikipedia.org/wiki/Skeleton_(computer_programming)
Franck Dernoncourt
1
Sehr praktisch bei der Bearbeitung von Ausnahmen. Manchmal bedeutet eine Ausnahme einen normalen Zustand, der nur eine andere Art der Verarbeitung erfordert. In diesem Fall ist passder exceptBlock sehr praktisch.
Mad Physicist

Antworten:

475

Angenommen, Sie entwerfen eine neue Klasse mit einigen Methoden, die Sie noch nicht implementieren möchten.

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

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

Wenn Sie passdas weglassen würden, würde der Code nicht ausgeführt.

Sie würden dann eine bekommen:

IndentationError: expected an indented block

Zusammenfassend lässt sich sagen, dass die passAussage nichts Besonderes bewirkt, aber wie hier gezeigt als Platzhalter fungieren kann.

sebastian_oe
quelle
22
Nun, in diesem Fall könnte man auch verwenden return, allerdings mit einem leichten Verlust an Klarheit.
38
Ich denke wirklich nicht, dass dies die Frage richtig beantwortet. Das Zitieren einer möglichen Verwendung für etwas, auch wenn es die häufigste Verwendung ist, ist nicht dasselbe wie zu erklären, wofür es ist.
Schilcote
5
@Schilcote: Ich verstehe deinen Standpunkt. Ich fügte meiner ersten Antwort eine weitere kurze Erklärung hinzu. Ich denke jedoch, dass ein einfaches Beispiel oft hilft, ein bestimmtes Konzept zu verstehen.
sebastian_oe
3
Die Antwort von @Anaphory unten zeigt, warum dies ein wichtiges Sprachelement ist.
John
2
Dies erklärt eine Verwendung von pass, aber ich verstehe immer noch nicht wirklich, was es tut. Gibt es eine Verwendung dafür im Produktionscode? In Ihrem Beispiel würde ich mich dafür entscheiden, diese Methode erst hinzuzufügen, wenn ich bereit bin, sie zu implementieren, oder ich würde es einfach tun return.
theUtherSide
221

Python hat die syntaktische Anforderung , dass Codeblocks (nach if, except, def, classetc.) nicht leer sein. Leere Codeblöcke sind jedoch in einer Vielzahl unterschiedlicher Kontexte nützlich, wie in den folgenden Beispielen, die die häufigsten Anwendungsfälle sind, die ich gesehen habe.

Wenn in einem Codeblock nichts passieren soll, passwird a benötigt, damit ein solcher Block kein erzeugt IndentationError. Alternativ kann jede Anweisung (einschließlich nur eines zu bewertenden Begriffs, wie das EllipsisLiteral ...oder eine Zeichenfolge, meistens eine Dokumentzeichenfolge) verwendet werden. Dies passmacht jedoch deutlich, dass tatsächlich nichts passieren soll und nicht tatsächlich ausgewertet werden muss und (zumindest vorübergehend) gespeichert.

  • Ignorieren (aller oder) einer bestimmten Art von Exception(Beispiel aus xml):

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

    Hinweis: Das Ignorieren aller Arten von Erhöhungen, wie im folgenden Beispiel aus pandas, wird im Allgemeinen als schlechte Praxis angesehen, da es auch Ausnahmen abfängt, die wahrscheinlich an den Anrufer weitergegeben werden sollten, z. B. KeyboardInterruptoder SystemExit(oder sogar HardwareIsOnFireError- Woher wissen Sie, dass Sie es nicht sind? Laufen auf einer benutzerdefinierten Box mit bestimmten definierten Fehlern, über die eine aufrufende Anwendung Bescheid wissen möchte?).

    try:
        os.unlink(filename_larry)
    except:
        pass

    Stattdessen wird die Verwendung von mindestens except Error:oder in diesem Fall vorzugsweise except OSError:als viel bessere Praxis angesehen. Eine schnelle Analyse aller von mir installierten Python-Module ergab, dass mehr als 10% aller except ...: passAnweisungen alle Ausnahmen abfangen. Daher ist dies in der Python-Programmierung immer noch ein häufiges Muster.

  • Ableiten einer Ausnahmeklasse, die kein neues Verhalten hinzufügt (z. B. in scipy):

    class CompileError(Exception):
        pass

    In ähnlicher Weise haben Klassen, die als abstrakte Basisklasse gedacht sind, häufig eine explizite leere __init__oder andere Methoden, die Unterklassen ableiten sollen. (zB pebl)

    class _BaseSubmittingController(_BaseController):
        def submit(self, tasks): pass
        def retrieve(self, deferred_results): pass
  • Das Testen dieses Codes wird für einige Testwerte ordnungsgemäß ausgeführt, ohne sich um die Ergebnisse (von mpmath) zu kümmern :

    for x, error in MDNewton(mp, f, (1,-2), verbose=0,
                             norm=lambda x: norm(x, inf)):
        pass
  • In Klassen- oder Funktionsdefinitionen ist häufig bereits ein Dokumentstring als obligatorische Anweisung vorhanden , die als einziges Element im Block ausgeführt werden muss. In solchen Fällen kann der Block pass zusätzlich zur Dokumentzeichenfolge enthalten, um zu sagen: "Dies soll in der Tat nichts bewirken.", Zum Beispiel in pebl:

    class ParsingError(Exception): 
        """Error encountered while parsing an ill-formed datafile."""
        pass
  • In einigen Fällen passwird als Platzhalter verwendet , zu sagen : „Diese Methode / Klasse / if-Block / ... wurde noch nicht implementiert, aber das wird der Ort , es zu tun sein“, obwohl ich persönlich die es vorziehen , Ellipsiswörtlichen , ...um Unterscheiden Sie streng zwischen diesem und dem absichtlichen „No-Op“ im vorherigen Beispiel. ( Beachten Sie, dass das Ellipsen-Literal nur in Python 3 ein gültiger Ausdruck ist. )
    Wenn ich beispielsweise ein Modell in großen Strichen schreibe, schreibe ich möglicherweise

    def update_agent(agent):
        ... 

    wo andere haben könnten

    def update_agent(agent):
        pass

    Vor

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

    Zur Erinnerung, um die update_agentFunktion zu einem späteren Zeitpunkt auszufüllen , führen Sie jedoch bereits einige Tests durch, um festzustellen, ob sich der Rest des Codes wie beabsichtigt verhält. (Eine dritte Option für diesen Fall ist raise NotImplementedError. Dies ist insbesondere in zwei Fällen nützlich: Entweder "Diese abstrakte Methode sollte von jeder Unterklasse implementiert werden, es gibt keine generische Möglichkeit, sie in dieser Basisklasse zu definieren" oder "Diese Funktion mit Dieser Name ist in dieser Version noch nicht implementiert, aber so wird seine Signatur aussehen. “ )

Anaphory
quelle
Dies ist eine weitaus bessere Antwort!
Rjoxford
22

Neben der Verwendung als Platzhalter für nicht implementierte Funktionen passkann es hilfreich sein, eine if-else-Anweisung auszufüllen ("Explizit ist besser als implizit.")

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

Natürlich würde man in diesem Fall wahrscheinlich returnanstelle der Zuordnung verwenden, aber in Fällen, in denen eine Mutation gewünscht wird, funktioniert dies am besten.

Die Verwendung von passhier ist besonders nützlich, um zukünftige Betreuer (einschließlich Sie selbst!) Zu warnen, keine redundanten Schritte außerhalb der bedingten Anweisungen zu setzen. Im obigen Beispiel flagwird in den beiden speziell genannten Fällen gesetzt, jedoch nicht im elseFall. Ohne Verwendung passkann sich ein zukünftiger Programmierer möglicherweise flag = Trueaußerhalb der Bedingung bewegen und somit flagin allen Fällen einstellen .


Ein anderer Fall ist die Boilerplate-Funktion, die häufig am Ende einer Datei angezeigt wird:

if __name__ == "__main__":
    pass

In einigen Dateien kann es hilfreich sein, dies dort passzu belassen, um später eine einfachere Bearbeitung zu ermöglichen, und um deutlich zu machen, dass nichts erwartet wird, wenn die Datei alleine ausgeführt wird.


Schließlich kann es, wie in anderen Antworten erwähnt, nützlich sein, nichts zu tun, wenn eine Ausnahme abgefangen wird:

try:
    n[i] = 0
except IndexError:
    pass
Micah Walter
quelle
2
Ich denke, die ersten beiden Beispiele sind im Allgemeinen eine schlechte Praxis. In Bezug auf das erste Beispiel sollten Sie flag = Falsevor dem if ... elif Block setzen, um später unklare Fehler "NameError: Name 'Flag' ist nicht definiert" zu vermeiden. In Bezug auf das zweite Beispiel scheint es bizzar, if __name__ == "__main__": passdie Mehrheit der Python-Dateien hinzufügen zu müssen, die bei direkter Ausführung nichts tun (was der Fall ist, wenn Sie modularen Code schreiben). Bei Python> = 3.0 sollten Sie ...(Auslassungspunkte) verwenden, anstatt pass"Später beenden" -Blöcke anzugeben.
Ostrokach
18

Die beste und genaueste Art zu denken passist, den Dolmetscher explizit anzuweisen, nichts zu tun. Auf die gleiche Weise den folgenden Code:

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

bedeutet "Wenn ich die Funktion foo (x, y) aufrufe, summiere die beiden Zahlen, die die Bezeichnungen x und y darstellen, und gib das Ergebnis zurück",

def bar():
    pass

bedeutet "Wenn ich die Funktionsleiste () aufrufe, mache ich absolut nichts."

Die anderen Antworten sind ganz richtig, aber es ist auch nützlich für ein paar Dinge, bei denen es nicht um Platzhalter geht.

Zum Beispiel war es in einem Code, an dem ich erst kürzlich gearbeitet habe, notwendig, zwei Variablen zu teilen, und es war möglich, dass der Teiler Null war.

c = a / b

erzeugt offensichtlich einen ZeroDivisionError, wenn b Null ist. In dieser speziellen Situation war es das gewünschte Verhalten, c als Null zu belassen, falls b Null war, daher habe ich den folgenden Code verwendet:

try:
    c = a / b
except ZeroDivisionError:
    pass

Eine andere, weniger standardmäßige Verwendung ist ein praktischer Ort, um einen Haltepunkt für Ihren Debugger festzulegen. Zum Beispiel wollte ich, dass bei der 20. Iteration einer for ... in-Anweisung ein bisschen Code in den Debugger eindringt. Damit:

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

mit dem Haltepunkt auf Pass.

Schilcote
quelle
def bar(): passmacht nicht "absolut nichts". Es kehrt Noneimplizit immer noch zurück .
Chepner
1
Ihr Punkt in Bezug auf den Debugger wird oft übersehen, ist aber wichtig. +1
Wtower
10

Ein häufiger Anwendungsfall, in dem es "wie es ist" verwendet werden kann, besteht darin, eine Klasse zu überschreiben, nur um einen Typ zu erstellen (der ansonsten mit der Oberklasse identisch ist), z

class Error(Exception):
    pass

So können Sie ErrorAusnahmen auslösen und abfangen . Was hier zählt, ist eher die Art der Ausnahme als der Inhalt.


quelle
6

passin Python macht im Grunde nichts, aber im Gegensatz zu einem Kommentar wird es vom Interpreter nicht ignoriert. Sie können es also an vielen Orten nutzen, indem Sie es zu einem Platzhalter machen:

1: Kann im Unterricht verwendet werden

   class TestClass: 
      pass

2: Kann in Schleifen- und bedingten Anweisungen verwendet werden:

   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: Kann in der Funktion verwendet werden:

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

passwird meistens verwendet, wenn der Programmierer im Moment keine Implementierung geben möchte, aber dennoch eine bestimmte Klassen- / Funktions- / Bedingungsanweisung erstellen möchte, die später verwendet werden kann. Da der Python-Interpreter keine leere oder nicht implementierte Anweisung class / function / conditional zulässt, wird ein Fehler ausgegeben:

IndentationError: Erwartet einen eingerückten Block

pass kann in solchen Szenarien verwendet werden.

Arijit
quelle
5

Sie können sagen, dass Pass NOP bedeutet (No Operation) Betrieb. Nach diesem Beispiel erhalten Sie ein klares Bild: -

C Programm

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

Nun, wie werden Sie das in Python schreiben: -

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 "

Ihr Code gibt jedoch einen Fehler aus, da nach elif ein eingerückter Block erforderlich ist . Hier ist die Rolle des Schlüsselworts 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 "

Jetzt denke ich, es ist dir klar.

Deepak Dixit
quelle
1
&&Operator existiert nicht in Python
Iván C.
5

Ich benutze es gerne, wenn ich Tests auslösche. Ich bin mir oft bewusst, was ich testen möchte, weiß aber nicht genau, wie ich es machen soll. Das Testbeispiel sieht so aus, wie es sebastian_oe vorgeschlagen hat

class TestFunctions(unittest.TestCase):

   def test_some_feature(self):
      pass

   def test_some_other_feature(self):
      pass
dm03514
quelle
Ich empfehle dringend, dies NICHT zu tun. Sie können einen solchen leeren Test leicht vergessen! Es ist besser, Tests mit immer fehlgeschlagenen Funktionscodes zu assert Falseassert 0
stubben,
4

Die pass-Anweisung macht nichts. Es kann verwendet werden, wenn eine Anweisung syntaktisch erforderlich ist, das Programm jedoch keine Aktion erfordert.

Harsha Biyani
quelle
4

Ehrlich gesagt denke ich, dass die offiziellen Python-Dokumente es ziemlich gut beschreiben und einige Beispiele liefern:

Die pass- Anweisung macht nichts. Es kann verwendet werden, wenn eine Anweisung syntaktisch erforderlich ist, das Programm jedoch keine Aktion erfordert. Zum Beispiel:

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

Dies wird häufig zum Erstellen von Minimalklassen verwendet:

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

Ein anderer Platzpass kann als Platzhalter für eine Funktion oder einen bedingten Körper verwendet werden, wenn Sie an neuem Code arbeiten, sodass Sie auf einer abstrakteren Ebene weiterdenken können. Der Pass wird stillschweigend ignoriert:

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

Usagi
quelle
0

Wie das Buch sagte, benutze ich es immer nur als temporären Platzhalter, dh

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

und füllen Sie später das Szenario aus, in dem var == 2000

Cameron Sparr
quelle
3
Über welches Buch sprichst du?
Entschuldigung ... Anleitung, die das OP erwähnt
Cameron Sparr
0

Pass bezieht sich auf Ignorieren .... so einfach wie es ist .... Wenn die angegebene Bedingung wahr ist und die nächste Anweisung Pass ist, ignoriert sie diesen Wert oder diese Iteration und fährt mit der nächsten Zeile fort ..... Beispiel

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

Ausgabe: Druckt alle ungeraden Zahlen von 1-100

Dies liegt daran, dass der Modul der geraden Zahl gleich Null ist, daher die Zahl ignoriert und zur nächsten Zahl übergeht, da der Modul der ungeraden Zahlen ungleich Null ist, wird der andere Teil der Schleife ausgeführt und gedruckt

Spülen
quelle
Ich bekomme eine SyntaxError. Auch dies ist keine gute Verwendung, passweil Sie einfach tun könntenfor i in range(1,100):print(i)if i%2else""
MilkyWay90
-1

Hier ist ein Beispiel, in dem ich bestimmte Daten aus einer Liste extrahiert habe, in der ich mehrere Datentypen hatte (so würde ich es in R nennen - sorry, wenn es die falsche Nomenklatur ist) und ich wollte nur ganzzahlige / numerische und NICHT Zeichendaten extrahieren .

Die Daten sahen aus wie:

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

Ich wollte alle alphabetischen Zeichen entfernen, also ließ ich die Maschine die Daten unterteilen und die alphabetischen Daten "übergeben":

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
quelle
-1

Die pass-Anweisung in Python wird verwendet, wenn eine Anweisung syntaktisch erforderlich ist, Sie jedoch keinen Befehl oder Code ausführen möchten.

Die pass-Anweisung ist eine Nulloperation. nichts passiert, wenn es ausgeführt wird. Der Pass ist auch an Stellen nützlich, an denen Ihr Code irgendwann abgelegt wird, aber noch nicht geschrieben wurde (z. B. in Stubs):

`Beispiel:

#!/usr/bin/python

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

print "Good bye!"

Dies führt zu folgendem Ergebnis:

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

Der vorhergehende Code führt keine Anweisung oder keinen Code aus, wenn der Wert des Buchstabens 'h' ist. Die pass-Anweisung ist hilfreich, wenn Sie einen Codeblock erstellt haben, diese jedoch nicht mehr benötigt wird.

Sie können dann die Anweisungen innerhalb des Blocks entfernen, den Block jedoch mit einer pass-Anweisung belassen, damit andere Teile des Codes nicht beeinträchtigt werden.

MKDHEERAJ
quelle
-1

pass wird verwendet, um Einrückungsfehler in Python zu vermeiden. Wenn wir Sprachen wie c, c ++, java verwenden, haben sie geschweifte Klammern wie

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

In Python wurden jedoch Einrückungen anstelle von geschweiften Klammern verwendet, um solche Fehler zu vermeiden, verwenden wir pass. Erinnert, als Sie ein Quiz spielten und

 if(dont_know_the_answer)
      pass

Beispielprogramm,

  for letter in 'geeksforgeeks':
        pass
  print 'Last Letter :', letter
Ganesh Chowdhary Sadanala
quelle