Eu tenho um dicionário que preciso passar chave / valores como argumentos de palavra-chave .. Por exemplo ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Isso funciona bem, mas se houver valores no d_args dict que não são aceitos pela example
função, ele obviamente morre. Digamos, se a função de exemplo for definida comodef example(kw2):
Isso é um problema, pois eu não controlo a geração do d_args
, ou da example
função .. Ambos vêm de módulos externos e example
só aceitam alguns dos argumentos-chave do dicionário.
Idealmente, eu apenas faria
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Provavelmente irei filtrar apenas o dict, de uma lista de argumentos de palavra-chave válidos, mas eu estava me perguntando: Existe uma maneira de listar programaticamente os argumentos de palavra-chave que uma função específica usa?
inspect.getargspec(f)
está obsoleto desde o Python 3.0; o método moderno éinspect.signature(f)
.co_varnames
opção, por outro lado, funciona em ambos.Isso imprimirá os nomes de todos os argumentos passáveis, palavras-chave e não palavras-chave:
Isso ocorre porque primeiro
co_varnames
são sempre os parâmetros (a seguir são as variáveis locais, comoy
no exemplo acima).Então agora você pode ter uma função:
Que você pode usar assim:
EDIT : Uma pequena adição: se você realmente precisa apenas de argumentos de palavra-chave de uma função, você pode usar o
func_defaults
atributo para extraí-los:Agora você pode chamar sua função com args conhecidos, mas kwargs extraídos, por exemplo:
Isso pressupõe que
func
não usa nenhum*args
ou**kwargs
magia em sua assinatura.fonte
Em Python 3.0:
fonte
Para uma solução Python 3, você pode usar
inspect.signature
e filtrar de acordo com o tipo de parâmetros que deseja conhecer.Obtendo uma função de amostra com parâmetros posicionais ou de palavra-chave, apenas palavra-chave, var posicional e var palavra-chave:
Você pode criar um objeto de assinatura para ele:
e, em seguida, filtre com uma compreensão de lista para descobrir os detalhes de que você precisa:
e, da mesma forma, para posições var usando
p.VAR_POSITIONAL
e palavra-chave var comVAR_KEYWORD
.Além disso, você pode adicionar uma cláusula ao if para verificar se existe um valor padrão, verificando se
p.default
é igualp.empty
.fonte
Ampliando a resposta do DzinX:
fonte