Frage

Das mag albern sein, aber es ist für eine Weile die Rückseite meines Gehirns wurde Gezeter.

Python gibt uns zwei eingebaute in einer Weise, Attribute von Objekten zu löschen, die del Befehlswort und die delattr integrierte Funktion. Ich ziehe es delattr , weil es ich denke, es ist ein bisschen deutlicher:

del foo.bar
delattr(foo, "bar")

Aber ich frage mich, ob es unter der Motorhaube Unterschiede zwischen ihnen sein könnte.

War es hilfreich?

Lösung

Die erste ist effizienter als die zweite. del foo.bar kompiliert zwei Bytecodebefehle:

  2           0 LOAD_FAST                0 (foo)
              3 DELETE_ATTR              0 (bar)

während delattr(foo, "bar") dauert fünf:

  2           0 LOAD_GLOBAL              0 (delattr)
              3 LOAD_FAST                0 (foo)
              6 LOAD_CONST               1 ('bar')
              9 CALL_FUNCTION            2
             12 POP_TOP             

Dies schlägt sich in die erste Lauf leicht schneller (aber es ist kein großer Unterschied - 0,15 & mgr; s auf meinem Rechner).

Wie die anderen gesagt haben, sollten Sie wirklich nur das zweite Formular verwenden, wenn das Attribut, das Sie löschen dynamisch bestimmt wird.

[Bearbeiten die Bytecode-Anweisungen in einer Funktion erzeugt zu zeigen, wo der Compiler LOAD_FAST und LOAD_GLOBAL verwenden]

Andere Tipps

  • del ist expliziter und effizient;
  • delattr ermöglicht dynamisches Attribut löschen.

Beachten Sie die folgenden Beispiele:

for name in ATTRIBUTES:
    delattr(obj, name)

oder:

def _cleanup(self, name):
    """Do cleanup for an attribute"""
    value = getattr(self, name)
    self._pre_cleanup(name, value)
    delattr(self, name)
    self._post_cleanup(name, value)

Sie können es nicht mit del .

Fraglos die ehemalige. Meiner Ansicht nach ist dies wie die Frage, ob foo.bar ist besser als getattr(foo, "bar"), und ich glaube nicht, dass jemand diese Frage stellt:)

Es ist wirklich eine Frage der Präferenz, aber die erste ist wahrscheinlich vorzuziehen. Ich würde nur die zweiten verwenden, wenn Sie den Namen des Attributs nicht wissen, dass Sie vor der Zeit sind zu löschen.

Wie getattr und setattr, delattr sollte nur verwendet werden, wenn der Attributname ist unbekannt.

In diesem Sinne ist es entspricht in etwa mehrere Python-Funktionen, die auf einer niedrigeren Ebene integrierte Funktionalität verwendet werden, um Zugriff auf als Sie normalerweise zur Verfügung haben, wie __import__ statt import und operator.add statt +

über das Innenleben nicht sicher, aber von einer Code-Wiederverwertbarkeit und kein Ruck Mitarbeiter Perspektive sein, verwendet del. Es ist mehr klar und verständlich von Menschen aus anderen Sprachen kommen auch.

Wenn Sie denken, delattr expliziter ist, warum dann getattr nicht verwendet, um die ganze Zeit statt object.attr?

Was unter der Haube ... Ihre Vermutung ist so gut wie meine. Wenn nicht wesentlich besser.

Es ist eine alte Frage, aber ich möchte meine 2 Cent in.

Obwohl, del foo.bar elegante, manchmal werden Sie delattr(foo, "bar") benötigen. Sprich, wenn Sie eine interaktive Befehlszeilenschnittstelle, die ein Benutzer ein Mitglied in dem Objekt dynamisch löschen kann, indem Eingabe den Namen , dann haben Sie keine andere Wahl, als die letztere Form enthalten ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top