5

Расширение кортежей в аргументы

13

Описание проблемы:

У меня есть функция следующего вида:

def myfun(a, b, c):
    return (a * 2, b + c, c + b)

Я определил кортеж:

some_tuple = (1, "foo", "bar")

Как мне использовать some_tuple для вызова функции myfun? Ожидаемый результат должен быть (2, "foobar", "barfoo").

Я понимаю, что мог бы изменить определение myfun, чтобы оно принимало кортеж напрямую, но мне нужно вызвать уже существующую функцию myfun.

Кто-нибудь подскажет, как это сделать?

2 ответ(ов)

0

Обратите внимание, что вы также можете развернуть часть списка аргументов:

myfun(1, *("foo", "bar"))

В этом примере мы передаем значение 1 как первый аргумент функции myfun, а затем развертываем кортеж ("foo", "bar"), чтобы передать его элементы в качестве следующих аргументов функции. Таким образом, вызов myfun(1, *("foo", "bar")) эквивалентен вызову myfun(1, "foo", "bar").

0

Подобно ответу @Dominykas, приведённый код представляет собой декоратор, который преобразует функции, принимающие несколько аргументов, в функции, принимающие кортежи. Вот пример реализации:

apply_tuple = lambda f: lambda args: f(*args)

Пример 1:

def add(a, b):
    return a + b

three = apply_tuple(add)((1, 2))

В данном примере мы определяем функцию add, которая складывает два числа. Затем мы применяем декоратор apply_tuple, чтобы вызвать add с кортежем (1, 2).

Пример 2:

@apply_tuple
def add(a, b):
    return a + b

three = add((1, 2))

В этом примере мы используем декоратор @apply_tuple непосредственно перед определением функции add. Это позволяет нам вызывать add, передавая кортеж (1, 2) непосредственно. В обоих случаях результатом будет сумма чисел, равная 3.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь