Я пытаюсь вызвать функцию внутри другой функции в Python, но не могу найти правильный синтаксис. Что я хочу сделать, это что-то вроде этого:
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])
В этом случае первый вызов будет работать, а второй - нет. Я хочу изменить функцию-обертку, а не вызываемые функции.
def wrapper(func, *args)
это то, чтоmethod(params object[] args)
в C #.*args
должен быть последний аргумент в определении функции.The * next to args means "take the rest of the parameters given and put them in a list called args".
Он помещает их в кортеж, а не в список.Самый простой способ обернуть функцию
... состоит в том, чтобы вручную написать оболочку, которая будет вызывать func () внутри себя:
В Python функция является объектом, поэтому вы можете передать ее имя в качестве аргумента другой функции и вернуть его. Вы также можете написать генератор-обертку для любой функции anyFunc () :
Также обратите внимание, что в Python, когда вы не знаете или не хотите называть все аргументы функции, вы можете ссылаться на кортеж аргументов, который обозначается его именем, которому предшествует звездочка в скобках после имя функции:
Например, вы можете определить функцию, которая будет принимать любое количество аргументов:
Python предусматривает еще больше манипуляций с аргументами функций. Вы можете разрешить функции принимать ключевые аргументы. Внутри тела функции ключевые аргументы хранятся в словаре. В скобках после имени функции этот словарь обозначается двумя звездочками, за которыми следует название словаря:
Аналогичный пример, который печатает словарь аргументов ключевого слова:
источник
Вы можете использовать синтаксис * args и ** kwargs для аргументов переменной длины.
Что означают * args и ** kwargs?
И из официального учебника по питону
http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
источник
Буквальный ответ на ваш вопрос (чтобы сделать именно то, что вы просили, изменив только обертку, а не функции или вызовы функций), просто изменить строку
читать
Это говорит Python, чтобы взять данный список (в этом случае,
args
) и передать его содержимое функции в качестве позиционных аргументов.Этот прием работает с обеих сторон вызова функции, поэтому функция определяется следующим образом:
будет в состоянии принять столько позиционных аргументов, сколько вы бросите на него, и поместить их все в список с именем
args
.Надеюсь, это поможет немного прояснить ситуацию. Обратите внимание, что это все возможно и с аргументами dicts / keyword, используя
**
вместо*
.источник
Вам нужно использовать аргументы распаковки ..
источник
Небольшое дополнение к предыдущим ответам, так как я не смог найти решение проблемы, которая не стоит открывать новый вопрос, но привела меня сюда.
Вот небольшой фрагмент кода, который сочетает в себе
lists
,zip()
и*args
, чтобы обеспечить оболочку , которая может иметь дело с неизвестным количеством функций с неизвестным количеством аргументов.Имейте в виду, что
zip()
это не обеспечивает проверку безопасности для списков неравной длины, см. Zip-итераторы, утверждающие равную длину в python .источник