Esiste un modo comune per verificare in Python se un oggetto è di qualsiasi tipo di funzione?

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top