Python Language
Die Pass-Anweisung
Suche…
Syntax
- bestehen
Bemerkungen
Warum sollten Sie dem Dolmetscher sagen, dass er nichts ausdrücklich tun soll? Python hat die syntaktische Anforderung, dass Codeblöcke (nachdem if
, except
def
, class
usw.) nicht leer sein dürfen.
Aber manchmal ist ein leerer Codeblock an sich nützlich. Ein leerer class
kann eine neue, andere Klasse definieren, z. B. eine Ausnahme, die abgefangen werden kann. Ein leerer except
kann der einfachste Weg sein, um "Bitte um Verzeihung später" auszudrücken, wenn es nichts gibt, um das man um Vergebung bitten kann. Wenn ein Iterator alle schweren Bewegungen ausführt, kann eine leere for
Schleife zum Ausführen des Iterators hilfreich sein.
Wenn also in einem Codeblock nichts passieren soll, ist ein pass
erforderlich, damit ein solcher Block keinen IndentationError
. Alternativ kann jede Aussage (einschließlich nur eines zu bewertenden Begriffs, wie das Ellipsis
Literal ...
oder eine Zeichenfolge, meistens ein Docstring) verwendet werden, aber der pass
macht deutlich, dass tatsächlich nichts passieren soll und nicht benötigt wird tatsächlich ausgewertet und (zumindest temporär) im Speicher abgelegt werden. Hier ist eine kleine kommentierte Sammlung der häufigsten Verwendungsmöglichkeiten von pass
, die mir begegnet sind - zusammen mit einigen Kommentaren zur guten und schlechten Praxis.
Ignorieren (alle oder) eine bestimmte Art von
Exception
(Beispiel ausxml
):try: self.version = "Expat %d.%d.%d" % expat.version_info except AttributeError: pass # unknown
Hinweis: Ignorieren aller Arten von Erhöhungen, wie im folgenden Beispiel von
pandas
, ist in der Regel schlechte Praxis betrachtet, weil es auch Ausnahmen abfängt , die wahrscheinlich auf den Aufrufer übergeben werden soll, zBKeyboardInterrupt
oderSystemExit
(oder sogarHardwareIsOnFireError
- Wie wissen Sie , Sie sind nicht auf einer benutzerdefinierten Box mit spezifischen Fehlern ausgeführt, über die einige aufrufende Anwendungen informiert werden möchten.try: os.unlink(filename_larry) except: pass
Verwenden Sie stattdessen mindestens
except Error:
oder in diesem Fall vorzugsweiseexcept OSError:
ist eine weitaus bessere Praxis. Eine schnelle Analyse aller von mir installierten Python-Module ergab, dass mehr als 10% allerexcept ...: pass
Anweisungen alle Ausnahmen abfangen, sodass es bei der Python-Programmierung immer noch ein häufiges Muster ist.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 ein explizit leeres
__init__
oder andere Methoden, die von Unterklassen abgeleitet werden sollen. (zBpebl
)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 zu kümmern (von
mpmath
):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 Docstring als obligatorische Anweisung vorhanden , die als einzige Funktion im Block ausgeführt werden muss. In solchen Fällen kann der Block zusätzlich zum Docstring
pass
enthaltenpass
um zu sagen: "Dies soll tatsächlich nichtspebl
". Zum Beispiel inpebl
:class ParsingError(Exception): """Error encountered while parsing an ill-formed datafile.""" pass
In einigen Fällen wird "
pass
als Platzhalter verwendet, um zu sagen "Diese Methode / Klasse / Wenn-Block / ... wurde noch nicht implementiert, aber dies ist derEllipsis
Ort dafür", obwohl ich persönlich dasEllipsis
Literal vorziehenEllipsis
...
(HINWEIS: nur Python-3), um genau zwischen diesem und dem absichtlichen "no-op" im vorherigen Beispiel zu unterscheiden. Wenn ich zum Beispiel ein Modell mit großen Strichen schreibe, schreibe ich vielleichtdef 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)
Als Erinnerung daran, die Funktion
update_agent
zu einem späteren Zeitpunkt auszufüllen, führen Sie jedoch bereits einige Tests durch, umupdate_agent
, ob sich der Rest des Codes wie beabsichtigt verhält. (Eine dritte Option für diesen Fall ist dieraise NotImplementedError
. Dies ist insbesondere in zwei Fällen hilfreich: 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 diesem Namen ist in dieser Version noch nicht implementiert, aber so wird die Signatur aussehen " )
Ausnahme ignorieren
try:
metadata = metadata['properties']
except KeyError:
pass
Erstellen Sie eine neue Ausnahme, die abgefangen werden kann
class CompileError(Exception):
pass