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 aus xml ):

     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, zB KeyboardInterrupt oder SystemExit (oder sogar HardwareIsOnFireError - 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 vorzugsweise except OSError: ist eine weitaus bessere Praxis. Eine schnelle Analyse aller von mir installierten Python-Module ergab, dass mehr als 10% aller except ...: 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. (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 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 enthalten pass um zu sagen: "Dies soll tatsächlich nichts pebl ". Zum Beispiel in pebl :

     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 der Ellipsis Ort dafür", obwohl ich persönlich das Ellipsis Literal vorziehen Ellipsis ... (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 vielleicht

     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)
    

    Als Erinnerung daran, die Funktion update_agent zu einem späteren Zeitpunkt auszufüllen, führen Sie jedoch bereits einige Tests durch, um update_agent , ob sich der Rest des Codes wie beabsichtigt verhält. (Eine dritte Option für diesen Fall ist die raise 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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow