if hasattr(obj, 'attribute'):
# do somthing
gegen
try:
# access obj.attribute
except AttributeError, e:
# deal with AttributeError
Welche sollte bevorzugt werden und warum?
if hasattr(obj, 'attribute'):
# do somthing
gegen
try:
# access obj.attribute
except AttributeError, e:
# deal with AttributeError
Welche sollte bevorzugt werden und warum?
Wenn das Attribut nicht vorhanden ist no eine Fehlerbedingung, hat die Variante der Ausnahmebehandlung ein Problem: Sie würde auch AttributeErrors abfangen, die möglicherweise intern beim Zugriff auf obj.attribute (z.B. weil attribute eine Eigenschaft ist, so dass der Zugriff darauf einen Code aufruft).
Dieses Thema wurde in dem EuroPython 2016 Vortrag behandelt Schnelleres Python schreiben von Sebastian Witowski. Hier ist eine Reproduktion seiner Folie mit der Zusammenfassung der Leistung. Er verwendet auch die Terminologie Vorsicht vor dem Sprung in dieser Diskussion, die es wert ist, hier erwähnt zu werden, um dieses Stichwort zu markieren.
Wenn das Attribut tatsächlich fehlt, wird das Bitten um Vergebung langsamer sein als um Erlaubnis zu bitten. Als Faustregel können Sie also um Erlaubnis bitten, wenn Sie wissen, dass das Attribut sehr wahrscheinlich Attribut fehlen wird oder andere Probleme, die Sie vorhersagen können. Andernfalls, wenn Sie erwarten, dass der Code in den meisten Fällen lesbar sein wird Code
# CASE 1 -- Attribute Exists
class Foo(object):
hello = 'world'
foo = Foo()
if hasatter(foo, 'hello'):
foo.hello
## 149ns ##
try:
foo.hello
except AttributeError:
pass
## 43.1 ns ##
## 3.5 times faster
# CASE 2 -- Attribute Absent
class Bar(object):
pass
bar = Bar()
if hasattr(bar, 'hello'):
bar.hello
## 428 ns ##
try:
bar.hello
except AttributeError :
pass
## 536 ns ##
## 25% slower
Ich würde Option 2 vorschlagen. Option 1 hat eine Race Condition, wenn ein anderer Thread das Attribut hinzufügt oder entfernt.
Auch Python hat eine Idiom dass EAFP ('leichter um Vergebung zu bitten als um Erlaubnis') besser ist als LBYL ('schau, bevor du springst').
Aus praktischer Sicht ist die Verwendung einer Bedingung in den meisten Sprachen immer deutlich schneller als die Behandlung einer Ausnahme.
Wenn Sie den Fall behandeln wollen, dass ein Attribut außerhalb der aktuellen Funktion nicht vorhanden ist, ist die Ausnahme der bessere Weg zu gehen. Ein Indikator dafür, dass Sie eine Ausnahme anstelle einer Bedingung verwenden sollten, ist die Tatsache, dass die Bedingung lediglich ein Flag setzt und die aktuelle Operation abbricht, während an anderer Stelle dieses Flag überprüft und darauf basierend Maßnahmen ergriffen werden.
Wie Rax Olgud hervorhebt, ist die Kommunikation mit anderen eine wichtige Eigenschaft des Codes, und es ist vielleicht wichtiger, was Sie sagen wollen, wenn Sie sagen: "Dies ist eine Ausnahmesituation" statt "Das ist etwas, das ich erwarte".
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
1 Stimmen
Duplikat: stackoverflow.com/questions/598157/ , stackoverflow.com/questions/610883/