Existe-t-il un moyen courant de vérifier en Python si un objet est un type de fonction?

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai une fonction en Python qui itère sur les attributs renvoyés par dir (obj) et je souhaite vérifier si l'un des objets qu'il contient est une fonction, une méthode, une fonction intégrée, etc. Normalement vous pouvez utiliser callable () pour cela, mais je ne veux pas inclure de classes. Le meilleur que j'ai trouvé jusqu'ici est:

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))

Existe-t-il un moyen plus sûr de procéder à cette vérification?

Modifier: Je me suis mal exprimé avant de dire: "Normalement, vous pouvez utiliser callable () pour cela, mais je ne veux pas disqualifier les classes." En fait, je veux vouloir disqualifier les classes. Je veux faire correspondre les fonctions uniquement , pas les classes.

Était-ce utile?

La solution

Le module d’inspection a exactement ce que vous voulez:

inspect.isroutine( obj )

Pour votre information, le code est le suivant:

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))

Autres conseils

Si vous souhaitez exclure des classes et d'autres objets aléatoires pouvant avoir une méthode __ call __ , et ne rechercher que des fonctions et des méthodes, ces trois fonctions du module inspecter

inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)

devrait faire ce que vous voulez d'une manière à l'avenir.

if hasattr(obj, '__call__'): pass

Cela s’intègre également mieux avec "Duck Typing" de Python. philosophie, parce que vous ne vous souciez pas vraiment de ce que c’est, aussi longtemps que vous pouvez l’appeler.

Il convient de noter que callable () est supprimé de Python et n'est pas présent dans la version 3.0.

Selon ce que vous entendez par 'classe':

callable( obj ) and not inspect.isclass( obj )

ou:

callable( obj ) and not isinstance( obj, types.ClassType )

Par exemple, les résultats sont différents pour 'dict':

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top