Como posso encontrar o número de argumentos de uma função Python? Preciso saber quantos argumentos normais ele possui e quantos argumentos nomeados.
Exemplo:
def someMethod(self, arg1, kwarg1=None):
pass
Este método possui 2 argumentos e 1 argumento nomeado.
inspect
módulo de biblioteca padrão.inspect
módulo possui muitos outros recursos, portanto, é injusto dizer que o módulo inteiro seria injustificado se uma função específica fosse. Além disso, é fácil ver como esse recurso pode ser mal utilizado. (Consulte stackoverflow.com/questions/741950 ). Dito isto, é um recurso útil, especialmente para escrever decoradores e outras funções que operam nessa função.Respostas:
A resposta aceita anteriormente foi descontinuada a partir de
Python 3.0
. Em vez de usar,inspect.getargspec
você deve agora optar pelaSignature
classe que a substituiu.Criar uma assinatura para a função é fácil através da
signature
função :Agora, você pode visualizar seus parâmetros rapidamente, usando
str
-o:ou você também pode obter um mapeamento de nomes de atributos para objetos de parâmetro via
sig.parameters
.Além disso, você pode chamar
len
desig.parameters
ver também o número de argumentos Esta função exige:Cada entrada no
params
mapeamento é na verdade umParameter
objeto que possui outros atributos, facilitando sua vida. Por exemplo, pegar um parâmetro e visualizar seu valor padrão agora é facilmente realizado com:da mesma forma para o restante dos objetos contidos em
parameters
.Quanto aos
2.x
usuários de Python , emborainspect.getargspec
não seja preterido, a linguagem em breve será :-). ASignature
turma não está disponível na2.x
série e não estará. Então você ainda precisa trabalharinspect.getargspec
.Quanto à transição entre Python 2 e 3, se você tiver o código que se baseia na interface
getargspec
em Python 2 e mudar parasignature
nos3
é muito difícil, você tem a opção valiosa de utilizarinspect.getfullargspec
. Ele oferece uma interface semelhante agetargspec
(um único argumento que pode ser chamado) para capturar os argumentos de uma função enquanto também lida com alguns casos adicionais quegetargspec
não:Assim como
getargspec
,getfullargspec
retorna aNamedTuple
que contém os argumentos.fonte
co_argcount
getfullargspec
não é implementado em Python 2.x, você precisará usargetargspec
getargspec
não funciona em built-in funções:getargspec(open)
dáTypeError: <built-in function open> is not a Python function
Veja esta resposta para algumas idéias ...print(args)
recebe,defaults=(None,)
você não recebedefaults=None
.veja o módulo de inspeção
fonte
inspect.signature
- docs.python.org/3/library/inspect.html#inspect.signatureou, se o nome da função atual for indeterminado:
fonte
dir(someMethod)
->'func_code'
; Vá além:dir(someMethod.func_code)
->'co_argcount'
; Você pode usar o built-indir()
para determinar os métodos disponíveis de um objeto.six.get_function_code(someMethod).co_argcount
some_method.__code__.co_argcount
co_argcount
é usado internamente durante a avaliação do objeto de código. O que estou tentando dizer é que realmente não há garantias de que esses atributos não mudem de uma versão para outra.inspect.getargspec ()
Veja você pode listar a palavra-chave-argumentos-a-função-python-recebe .
fonte
Além disso, também vi que na maioria das vezes a função help () realmente ajuda
Por exemplo, fornece todos os detalhes sobre os argumentos necessários.
dá o abaixo
fonte
help
A função mostra apenas o que a doutrina diz. Você já testou se funciona com a definição de função na pergunta?help()
cospe mais do que apenas a sequência de documentos - mesmo em código não documentado, ele ainda imprime o argspec e informa onde o código foi definido. A pessoa que postou a pergunta original não sabia ao certo se precisava de uma resposta amigável à máquina ou ao ser humano. Se ele só precisa ser humano,help()
é perfeitamente adequado.help()
retorne e tentar encontrar oargs
ekwargs
.Boas notícias para quem deseja fazer isso de maneira portátil entre o Python 2 e o Python 3.6+: use
inspect.getfullargspec()
method. Funciona no Python 2.xe 3.6+Como Jim Fasarakis Hilliard e outros apontaram, costumava ser assim:
1. No Python 2.x: use
inspect.getargspec()
2. No Python 3.x: use assinatura, como
getargspec()
egetfullargspec()
foi preterido.No entanto, iniciando o Python 3.6 (por demanda popular?), As coisas mudaram para melhor:
Na página de documentação do Python 3 :
fonte
inspect.getargspec () para atender às suas necessidades
fonte
Como sugerem outras respostas,
getargspec
funciona bem desde que a coisa que está sendo consultada seja realmente uma função. Ele não funciona para built-in funções, tais comoopen
,len
, etc, e irá lançar uma exceção em tais casos:A função abaixo (inspirada nesta resposta ) demonstra uma solução alternativa. Retorna o número de argumentos esperado por
f
:A idéia é analisar a especificação da função fora da
__doc__
string. Obviamente, isso depende do formato da referida string, portanto, dificilmente é robusta!fonte
func.__code__.co_argcount
dá-lhe número de quaisquer argumentos ANTES*args
func.__kwdefaults__
fornece um ditado dos argumentos da palavra - chave APÓS*args
func.__code__.co_kwonlyargcount
é igual alen(func.__kwdefaults__)
func.__defaults__
fornece os valores dos argumentos opcionais que aparecem antes*args
Aqui está a ilustração simples:
fonte
No:
Fora:
Nota: Se xyz não pertencesse à classe X e não tivesse "eu" e apenas "a, b, c", seria impresso 3.
Para python abaixo de 3,5, convém substituir
inspect.getfullargspec
porinspect.getargspec
no código acima.fonte