Miré this thread pero algunos de los conceptos están por encima de mi nivel actual. En Python 2.x, existe el método incorporado callable()
; ¿Hay alguna manera simple de verificar si algo es invocable o no usar Python 3?alternativo a llamable(), para uso en Python 3
Respuesta
En su lugar, puede hacer hasattr(object_name, '__call__')
. A diferencia de Python 2.x, esto funciona para todos los objetos invocables, incluidas las clases.
En Python 2.x, funciona para clases de estilo nuevo pero no de estilo antiguo. Recuerde, sin embargo, el '__call__' llamado en una clase (de nuevo estilo) es' type''s (o la metaclass de la clase), no de la clase. – kindall
@kindall: Buen punto, vale la pena tener en cuenta. Aunque, por supuesto, sería bastante extraño si fuera diferente. Esto también le permite hacer cosas funky como 'class_name()()' –
Tenga en cuenta que esto dará un falso positivo en el siguiente caso de esquina: 'clase C (objeto): pase; c = C(); c .__ call__ = lambda self: None'. Aunque 'c' ahora tiene una función como el atributo __call__,' c() 'fallará, aunque la comprobación' hasattr' tendrá éxito. No estoy seguro, pero tampoco puedo descartar un caso de esquina falso negativo, aunque de ser posible probablemente requeriría objetos implementados en C para activarlo. – mtraceur
callable()
está de vuelta en Python 3.2.
Si tiene que usar Python 3.1 (muy poco probable) entonces, además de la comprobación de __call__
también existen las siguientes soluciones:
2to3 cambia un
callable(x)
enisinstance(x, collections.Callable)
seis usos
any("__call__" in klass.__dict__ for klass in type(x).__mro__)
Es decir, comprueba
__call__
en las clases base. Esto me recuerda que debería preguntarle a Benjamin por qué. :)
Y, por último, por supuesto puede simplemente tratar:
try:
x = x()
except TypeError:
pass
Gran referencia de 2to3 ... que es un argumento convincente para usar 'collections.Callable'. El ABC está en todas partes ahora, parece. – Russ
Brillante. Pero prueba/excepto que el consejo es aterrador. – Shekhar
@Shekhar: el manejo de excepciones no da miedo una vez que estás acostumbrado. –
Está de regreso. Python 3.2 tiene callable()
; ya no es necesario utilizar una de las alternativas menos convenientes.
- 1. Uso de Python 3 super()
- 2. alternativo a la función
- 3. ¿Alternativo a cookies de HTTP?
- 4. ¿Texto alternativo para UITableView vacío?
- 5. Uso de Regionerate en VS2012, o addin alternativo
- 6. correcto uso de variables globales en Python 3
- 7. Hibernate 4.1Final alternativo para Hibernate.STRING
- 8. Cliente SOAP para Python 3
- 9. Python 3 reemplazo para ftputil?
- 10. alternativo para mysql_num_rows utilizando DOP
- 11. ¿No IDLE para Python 3?
- 12. Bluetooth lib para python 3
- 13. Puerto OAuth para Python 3
- 14. Patrón de diseño alternativo a Coroutines
- 15. Python en OpenOffice 3
- 16. python 3 en emacs
- 17. Python - Virtualenv, python 3?
- 18. Sin has_key() para Python 3 diccionarios
- 19. Uso de C# web api con contenido alternativo tipo
- 20. Python 3 con Emacs
- 21. Lo que es alternativo a Singleton
- 22. Software alternativo a Google Search Appliance (GSA)
- 23. CSS alternativo a este código CSS-jQuery?
- 24. ¿Cómo uso los módulos de tkinter con Python 3?
- 25. Objeto llamable de PHP como miembro de objeto
- 26. IDE alternativo para VB6 y VBA
- 27. Replicación de MySQL para el escenario alternativo
- 28. ¿A dónde desapareció link_to_function en Rails 3?
- 29. Método de carga alternativo para Django FileField
- 30. Python se extiende con - el uso de super() Python 3 vs Python 2
No estoy de acuerdo con su elección de respuesta aceptada. Creo que [la respuesta de joeforker] (http://stackoverflow.com/a/10045780/5420829) es mejor. –
Estoy de acuerdo. Mi respuesta ahora está desactualizada. Sería bueno si OP cambiara la respuesta a una de las actualmente válidas. –