Как вызвать функцию без обязательных аргументов? - PullRequest
1 голос
/ 04 июня 2019

Я хотел бы создать список функций, которые устанавливают значения по умолчанию для ранее определенных функций, чтобы позже я мог вызывать их только с одним аргументом. Проблема в том, что первый аргумент обязателен, поэтому я получаю сообщение об ошибке. Какой самый питонический способ это сделать?

def plus(num, a1):
    return num + a1

def div(num, a1):
    return num / a1;

acts = [plus(a1 = 3), div(a1 = 3), div(a1 = 2)]

num = 9
for act in acts:
    num = act(num)

Мое желаемое поведение - чтобы num был 9 -> 12 -> 4 -> 2

Ответы [ 2 ]

4 голосов
/ 04 июня 2019

Используйте funtools.partial, вам нужно перевернуть параметры, так как частичное применяет их по порядку:

from functools import partial

def plus(a1, num):
    return num + a1

f = partial(plus, 3)

Как пример:

>>> f = partial(plus, 3)
>>> f(10)
13

Или используйте значения по умолчанию:

def div(num, a1=1):
    return num / a1

fdiv = partial(div, a1=3)

Например:

>>> acts = [partial(plus, 3), partial(div,a1 = 3), partial(div, a1 = 2)]
>>> num = 9
>>> for act in acts:
...     num = act(num)
...
>>> num
2.0
1 голос
/ 04 июня 2019

Для вашего случая вы можете сделать что-то вроде:

def plus(num, a1):
    return num + a1

def div(num, a1):
    return num / a1;

acts = [(plus, 3), (div, 3), (div, 2)]

num = 9
for func, arg in acts:
    print(func(num, arg))

, что позволит вам предварительно ввести аргументы в список и выполнить итерацию.

...