Existe uma maneira comum de verificar em Python se um objeto é de algum tipo de função?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu tenho uma função em Python que está iterando sobre os atributos retornados de dir(obj) e quero verificar se algum dos objetos contidos nela é uma função, método, função interna, etc.Normalmente você poderia usar callable() para isso, mas não quero incluir classes.O melhor que descobri até agora é:

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

Existe uma maneira mais preparada para o futuro de fazer essa verificação?

Editar: Eu falei errado antes quando disse:"Normalmente você pode usar o Callable () para isso, mas não quero desqualificar as aulas". eu na verdade fazer querem desqualificar aulas.eu quero combinar apenas funções, não classes.

Foi útil?

Solução

O módulo inspecionar tem exatamente o que você deseja:

inspect.isroutine( obj )

Para sua informação, o código é:

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

Outras dicas

Se você quiser excluir classes e outros objetos aleatórios que possam ter um __call__ método, e apenas verifica funções e métodos, essas três funções no inspect módulo

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

deve fazer o que quiser de uma forma preparada para o futuro.

if hasattr(obj, '__call__'): pass

Isso também se encaixa melhor na filosofia de "digitação de pato" do Python, porque você realmente não se importa o que é, contanto que você possa chamá-lo.

Vale a pena notar que callable() está sendo removido do Python e não está presente no 3.0.

Dependendo do que você quer dizer com 'classe':

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

ou:

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

Por exemplo, os resultados são diferentes para 'dict':

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top