Estou tentando chamar uma função dentro de outra função em python, mas não consigo encontrar a sintaxe correta. O que eu quero fazer é algo como isto:
def wrapper(func, args):
func(args)
def func1(x):
print(x)
def func2(x, y, z):
return x+y+z
wrapper(func1, [x])
wrapper(func2, [x, y, z])
Nesse caso, a primeira chamada funcionará e a segunda não. O que eu quero modificar é a função de wrapper e não as funções chamadas.
def wrapper(func, *args)
é o quemethod(params object[] args)
está em c #.*args
deve ser o último argumento na definição da função.The * next to args means "take the rest of the parameters given and put them in a list called args".
Ele os coloca em uma tupla, não em uma lista.A maneira mais simples de quebrar uma função
... é escrever manualmente um wrapper que chamaria func () dentro de si:
No Python, a função é um objeto, para que você possa passar o nome como argumento de outra função e retorná-lo. Você também pode escrever um gerador de wrapper para qualquer função anyFunc () :
Observe também que no Python, quando você não sabe ou não deseja nomear todos os argumentos de uma função, pode se referir a uma tupla de argumentos, que é indicada por seu nome, precedida por um asterisco entre parênteses após o nome da função:
Por exemplo, você pode definir uma função que aceite qualquer número de argumentos:
O Python fornece ainda mais manipulação nos argumentos das funções. Você pode permitir que uma função aceite argumentos de palavras-chave. Dentro do corpo da função, os argumentos da palavra-chave são mantidos em um dicionário. Entre parênteses após o nome da função, este dicionário é indicado por dois asteriscos seguidos pelo nome do dicionário:
Um exemplo semelhante que imprime o dicionário de argumentos de palavras-chave:
fonte
Você pode usar a sintaxe * args e ** kwargs para argumentos de comprimento variável.
O que significam * args e ** kwargs?
E do tutorial oficial do python
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
fonte
A resposta literal à sua pergunta (para fazer exatamente o que você pediu, alterando apenas o invólucro, não as funções ou as chamadas de função) é simplesmente alterar a linha
ler
Isso diz ao Python para pegar a lista fornecida (nesse caso
args
) e passar seu conteúdo para a função como argumentos posicionais.Esse truque funciona nos dois "lados" da chamada de função, portanto, uma função definida assim:
seria capaz de aceitar o maior número possível de argumentos posicionais e colocá-los todos em uma lista chamada
args
.Espero que isso ajude a esclarecer um pouco as coisas. Observe que isso também é possível com argumentos dicts / keyword, usando em
**
vez de*
.fonte
Você precisa usar argumentos para descompactar ..
fonte
Uma pequena adição às respostas anteriores, já que não consegui encontrar uma solução para um problema, que não vale a pena abrir uma nova pergunta, mas me levou até aqui.
Aqui está um pequeno trecho de código, que combina
lists
,zip()
e*args
, para proporcionar um invólucro que pode lidar com uma quantidade desconhecida de funções com uma quantidade desconhecida de argumentos.Lembre-se de que
zip()
isso não fornece uma verificação de segurança para listas de tamanhos diferentes; consulte iteradores zip afirmando o mesmo comprimento em python .fonte