Esiste un modo comune per verificare in Python se un oggetto è di qualsiasi tipo di funzione?
Domanda
Ho una funzione in Python che esegue l'iterazione sugli attributi restituiti da dir(obj) e voglio verificare se qualcuno degli oggetti contenuti all'interno è una funzione, un metodo, una funzione incorporata, ecc.Normalmente potresti usare callable() per questo, ma non voglio includere classi.Il meglio che ho trovato finora è:
isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))
Esiste un modo più a prova di futuro per eseguire questo controllo?
Modificare: Prima ho parlato male quando ho detto:"Normalmente potresti usare Callable () per questo, ma non voglio squalificare le classi." io attualmente Fare vogliono squalificare le classi.Voglio abbinare soltanto funzioni, non classi.
Soluzione
Il modulo di ispezione ha esattamente ciò che desideri:
inspect.isroutine( obj )
Per tua informazione il codice è:
def isroutine(object):
"""Return true if the object is any kind of function or method."""
return (isbuiltin(object)
or isfunction(object)
or ismethod(object)
or ismethoddescriptor(object))
Altri suggerimenti
Se vuoi escludere classi e altri oggetti casuali che potrebbero avere un file __call__
metodo e controlla solo funzioni e metodi, queste tre funzioni nel file inspect
modulo
inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)
dovresti fare quello che vuoi in un modo a prova di futuro.
if hasattr(obj, '__call__'): pass
Questo si adatta meglio anche alla filosofia della "dattilografia" di Python, perché non ti interessa davvero Che cosa lo è, purché tu possa chiamarlo.
Vale la pena notarlo callable()
è stato rimosso da Python e non è presente nella versione 3.0.
A seconda di cosa intendi per "classe":
callable( obj ) and not inspect.isclass( obj )
O:
callable( obj ) and not isinstance( obj, types.ClassType )
Ad esempio, i risultati sono diversi per 'dict':
>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True