Você pode elaborar sua pergunta específica e talvez dar um exemplo com o resultado esperado?
jhwist
Presumivelmente, ele está procurando funcionalidades nas bibliotecas Python ou de terceiros que retornarão a assinatura de um método (nomes e tipos de parâmetros e valor retornado), dado o nome do método.
precisa saber é o seguinte
1
Assinatura como em como chamá-lo e tal? Tente help(yourmethod)por exemplohelp(map)
AttributeError: o objeto 'module' não tem atributo 'getargspec'
Spì
3
@Spi, você está chamando inspect.getargspecum módulo, não uma função.
Mike Graham
Obrigado, o problema foi com o Eclipse que não viu o módulo de inspeção
spì
Se uma função tiver anotações de argumento ou argumentos apenas de palavras-chave (= se você estiver usando o Python 3), será necessário chamar getfullargspec. ( ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them)
badp 13/07
2
@darth_coder: no Python2, getargspecaumenta TypeErrorse a entrada não for reconhecida como uma função Python - ou seja, uma função implementada no Python. No CPython, Exception.__init__é implementado em C, daí o TypeError. Você precisará verificar o código-fonte para entender a assinatura da chamada. No Python3, getargspecé implementado de maneira diferente e inspect.getargspec(Exception.__init__)retorna uma ArgSpecinstância.
Unutbu
44
Indiscutivelmente, a maneira mais fácil de encontrar a assinatura de uma função seria help(function):
>>>def function(arg1, arg2="foo",*args,**kwargs):pass>>> help(function)Help on function function in module __main__:
function(arg1, arg2='foo',*args,**kwargs)
inspect.signaturetambém está disponível para Python 2 através do funcsigsprojeto de backport: pypi.python.org/pypi/funcsigs
ncoghlan
14
#! /usr/bin/env pythonimport inspect
from collections import namedtuple
DefaultArgSpec= namedtuple('DefaultArgSpec','has_default default_value')def _get_default_arg(args, defaults, arg_index):""" Method that determines if an argument has default value or not,
and if yes what is the default value for the argument
:param args: array of arguments, eg: ['first_arg', 'second_arg', 'third_arg']
:param defaults: array of default values, eg: (42, 'something')
:param arg_index: index of the argument in the argument array for which,
this function checks if a default value exists or not. And if default value
exists it would return the default value. Example argument: 1
:return: Tuple of whether there is a default or not, and if yes the default
value, eg: for index 2 i.e. for "second_arg" this function returns (True, 42)
"""ifnot defaults:returnDefaultArgSpec(False,None)
args_with_no_defaults = len(args)- len(defaults)if arg_index < args_with_no_defaults:returnDefaultArgSpec(False,None)else:
value = defaults[arg_index - args_with_no_defaults]if(type(value)is str):
value ='"%s"'% value
returnDefaultArgSpec(True, value)def get_method_sig(method):""" Given a function, it returns a string that pretty much looks how the
function signature would be written in python.
:param method: a python method
:return: A string similar describing the pythong method signature.
eg: "my_method(first_argArg, second_arg=42, third_arg='something')"
"""# The return value of ArgSpec is a bit weird, as the list of arguments and# list of defaults are returned in separate array.# eg: ArgSpec(args=['first_arg', 'second_arg', 'third_arg'],# varargs=None, keywords=None, defaults=(42, 'something'))
argspec = inspect.getargspec(method)
arg_index=0
args =[]# Use the args and defaults array returned by argspec and find out# which arguments has defaultfor arg in argspec.args:
default_arg = _get_default_arg(argspec.args, argspec.defaults, arg_index)if default_arg.has_default:
args.append("%s=%s"%(arg, default_arg.default_value))else:
args.append(arg)
arg_index +=1return"%s(%s)"%(method.__name__,", ".join(args))if __name__ =='__main__':def my_method(first_arg, second_arg=42, third_arg='something'):passprint get_method_sig(my_method)# my_method(first_argArg, second_arg=42, third_arg="something")
Talvez um pouco atrasado para a festa, mas se você também quiser manter a ordem dos argumentos e seus padrões , poderá usar o módulo Abstract Syntax Tree (ast) .
Aqui está uma prova de conceito (cuidado com o código para classificar os argumentos e combiná-los com seus padrões, com certeza pode ser melhorado / esclarecido):
import ast
for class_ in[c for c in module.body if isinstance(c, ast.ClassDef)]:for method in[m for m in class_.body if isinstance(m, ast.FunctionDef)]:
args =[]if method.args.args:[args.append([a.col_offset, a.id])for a in method.args.args]if method.args.defaults:[args.append([a.col_offset,'='+ a.id])for a in method.args.defaults]
sorted_args = sorted(args)for i, p in enumerate(sorted_args):if p[1].startswith('='):
sorted_args[i-1][1]+= p[1]
sorted_args =[k[1]for k in sorted_args ifnot k[1].startswith('=')]if method.args.vararg:
sorted_args.append('*'+ method.args.vararg)if method.args.kwarg:
sorted_args.append('**'+ method.args.kwarg)
signature ='('+', '.join(sorted_args)+')'print method.name + signature
Se você estiver realmente tentando analisar a assinatura da função, use argspec do módulo de inspeção. Eu tive que fazer isso ao validar a função de script de gancho do usuário em uma estrutura geral.
help(yourmethod)
por exemplohelp(map)
Respostas:
No entanto, observe que isso
inspect.getargspec()
foi preterido desde o Python 3.0.O Python 3.0--3.4 recomenda
inspect.getfullargspec()
.O Python 3.5+ recomenda
inspect.signature()
.fonte
inspect.getargspec
um módulo, não uma função.getfullargspec
. (ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them
)getargspec
aumentaTypeError
se a entrada não for reconhecida como uma função Python - ou seja, uma função implementada no Python. No CPython,Exception.__init__
é implementado em C, daí oTypeError
. Você precisará verificar o código-fonte para entender a assinatura da chamada. No Python3,getargspec
é implementado de maneira diferente einspect.getargspec(Exception.__init__)
retorna umaArgSpec
instância.Indiscutivelmente, a maneira mais fácil de encontrar a assinatura de uma função seria
help(function)
:Além disso, no Python 3, um método foi adicionado ao
inspect
módulo chamadosignature
, projetado para representar a assinatura de um objeto que pode ser chamado e sua anotação de retorno :fonte
inspect.signature
também está disponível para Python 2 através dofuncsigs
projeto de backport: pypi.python.org/pypi/funcsigsfonte
def foo(a, *, b:int, **kwargs)
chamadas comfoo(4, b=3.3)
Tente chamar
help
um objeto para descobrir mais sobre ele.fonte
Talvez um pouco atrasado para a festa, mas se você também quiser manter a ordem dos argumentos e seus padrões , poderá usar o módulo Abstract Syntax Tree (ast) .
Aqui está uma prova de conceito (cuidado com o código para classificar os argumentos e combiná-los com seus padrões, com certeza pode ser melhorado / esclarecido):
fonte
Se tudo o que você está tentando fazer é imprimir a função, use pydoc.
Se você estiver realmente tentando analisar a assinatura da função, use argspec do módulo de inspeção. Eu tive que fazer isso ao validar a função de script de gancho do usuário em uma estrutura geral.
fonte
Código de exemplo:
fonte
Use% pdef na linha de comando (IPython), ele imprimirá apenas a assinatura.
por exemplo
%pdef np.loadtxt
fonte