Ich schaute auf this thread, aber einige der Konzepte sind über meinem derzeitigen Niveau. In Python 2.x existiert die eingebaute Methode callable()
; Gibt es eine einfache Möglichkeit zu überprüfen, ob etwas aufrufbar ist oder nicht Python 3 verwendet?Alternative zu Callable(), zur Verwendung in Python 3
Antwort
Sie können einfach hasattr(object_name, '__call__')
stattdessen tun. Anders als in Python 2.x funktioniert das für alle aufrufbare Objekte, einschließlich Klassen.
In Python 2.x funktioniert es für Klassen im neuen Stil, aber nicht im alten Stil. Denken Sie daran, dass das aufgerufene "__call__" für eine (neue) Klasse "type's" (oder die Metaklasse der Klasse) ist, nicht die Klasse. – kindall
@Kindall: Guter Punkt, der es wert ist, im Kopf zu behalten. Obwohl es natürlich etwas seltsam wäre, wenn es anders wäre. Dies ermöglicht es Ihnen auch, funky Dinge wie 'class_name()()' –
zu tun. Bitte beachten Sie, dass dies im folgenden Eckfall ein falsch positives Ergebnis ergibt: 'Klasse C (Objekt): pass; c = C(); c .__ call__ = lambda selbst: Keine'. Obwohl 'c' jetzt eine Funktion als Attribut __call__ hat, wird 'c()' fehlschlagen, obwohl die 'hasattr'-Prüfung erfolgreich ist. Ich bin mir nicht sicher, aber ich kann nicht ausschließen, dass auch ein false-negativer corner-case möglich ist, obwohl es, wenn möglich, wahrscheinlich implementierte-in-C-Code-Objekte erfordern würde, um ihn auszulösen. – mtraceur
callable()
ist wieder in Python 3.2.
Wenn benötigen Sie Python verwenden 3.1 (sehr unwahrscheinlich), dann zusätzlich für __call__
zu Überprüfung gibt es auch die folgenden Lösungen:
2to3 ändert ein
callable(x)
inisinstance(x, collections.Callable)
sechs Anwendungen
any("__call__" in klass.__dict__ for klass in type(x).__mro__)
Ie überprüft er für
__call__
in den Basisklassen. Das erinnert mich daran, dass ich Benjamin fragen sollte warum. :)
Und schließlich kann man natürlich einfach versuchen:
try:
x = x()
except TypeError:
pass
Große 2to3 Referenz ... das ist ein überzeugendes Argument für die Verwendung von 'collections.Callable'. ABCs sind jetzt überall, scheint es. – Russ
Brilliant. Aber versuchen/außer Rat ist beängstigend. – Shekhar
@Shekhar: Ausnahmebehandlung ist nicht gruselig, sobald Sie daran gewöhnt sind. –
Es ist zurück. Python 3.2 hat callable()
; Es besteht keine Notwendigkeit mehr, eine der weniger bequemen Alternativen zu verwenden.
- 1. Alternative zu CasperJS zur Verwendung mit Cucumber.js
- 2. Alternative zur Verwendung mehrerer FloatingActionButtons?
- 3. Alternative zur Verwendung von Eval in Javascript
- 4. Alternative zur Verwendung der Beziehung mit SQLite
- 5. Alternative zur Verwendung von udevadm Befehl
- 6. Silverlight 3 Alternative zu FileVersionInfo.GetVersionInfo
- 7. Python 3.x: alternative pprint-Implementierung
- 8. Alternative (schneller) Krieg zu 3 verschachtelt für Schleife Python
- 9. Alternative zu Goto-Schlüsselwort in Python
- 10. Ruby Alternative zur Verwendung von Klassenvariablen in ActiveSupport :: Concern
- 11. Idiomatische Alternative zur Reflexion
- 12. Gibt es eine Alternative zur Verwendung von Minus in px
- 13. Alternative zur Verwendung von ng-init in 'view'?
- 14. Navigieren in Callable-Iteratoren
- 15. Verwendung von Python 3 super()
- 16. Python 3 und http.server Verwendung
- 17. Alternative zur Ausführung dynamischer SQL
- 18. PHP Alternative zur Verwendung einer Abfrage innerhalb einer Schleife
- 19. Python Alternative zu R Markdown
- 20. Gibt es eine konfigurierbare Alternative zur Verwendung von @Version?
- 21. Django: Alternative zur Verwendung von Annotate (Count()) für Geschwindigkeit
- 22. Gibt es eine Alternative zur Verwendung von sun.jdbc.odbc.JdbcOdbcDriver?
- 23. Eine Alternative zu globalen in Python
- 24. AJAX Alternative zur Verwendung von jQuery Form ui
- 25. PHP - Alternative zur Verwendung innerhalb einer Schleife enthalten
- 26. Was ist die neue Art der Überprüfung "Callable" Methoden in Python 3.x?
- 27. Alternative Konstruktoren in Python
- 28. Gibt es eine Alternative zur Verwendung mehrerer UND-Operatoren?
- 29. Testflug Alternative zur Produktion
- 30. Wie bekomme ich Python zur Verwendung Assembly
Ich stimme nicht mit Ihrer Wahl der akzeptierten Antwort. Ich denke [Joeforker's Antwort] (http://stackoverflow.com/a/10045780/5420829) ist besser. –
Ich stimme zu. Meine Antwort ist nun veraltet - es wäre schön, wenn OP die Antwort auf eine der aktuell gültigen ändern würde. –