Ich arbeite an einem Python-Socket-Code, der die socket.fromfd()
-Funktion verwendet.Ermitteln, ob eine Funktion in einem Python-Modul verfügbar ist
Diese Methode ist jedoch nicht auf allen Plattformen verfügbar, daher schreibe ich einen Fallback-Code für den Fall, dass die Methode nicht definiert ist.
Was ist der beste Weg festzustellen, ob eine Methode zur Laufzeit definiert ist? Ist das Folgende ausreichend oder gibt es ein besseres Idiom?
if 'fromfd' in dir(socket):
sock = socket.fromfd(...)
else:
sock = socket.socket(...)
Ich bin etwas besorgt, dass die Dokumentation für dir()
scheint seine Verwendung zu verhindern. Wäre getattr()
eine bessere Wahl sein, wie in:
if getattr(socket, 'fromfd', None) is not None:
sock = socket.fromfd(...)
else:
sock = socket.socket(...)
Gedanken?
EDIT Wie Paolo wies darauf hin, diese Frage ist nearly a duplicate eine Frage über Attribut Präsenz zu bestimmen. Da die verwendete Terminologie jedoch disjunkt ist (lk's "Objekt hat ein Attribut" vs mein "Modul hat eine Funktion") kann es hilfreich sein, diese Frage für die Durchsuchbarkeit zu bewahren, es sei denn, die beiden können kombiniert werden.
Ich sehe nicht, wie diese Antwort ein downvote verdient ...:/ –
ich hasattr über getattr nur willen zur besseren Lesbarkeit lieber! – bobince
"hasattr sollte nicht verwendet werden, da es Ausnahmen einschließlich KeyboardInterrupt verschluckt." (c) http://doc.bazaar.canonical.com/developers/code-style.html#hasattr-and-getattr, also ist "getattr" eine gute Sache. –