Как использовать аргументы по умолчанию в вызове функции с * args и ** kwargs? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующий простой пример кода:

def wrapper(foo, para1=1, *args):
    print("para1: "+ str(para1))
    print(foo(*args))

def foo1(x):
    return 2*x

wrapper(foo1, 2, 3)

, где я определяю функцию wrapper, которая имеет один параметр para1 со значением по умолчанию 1.

Но для правильного вызова оболочки с функцией foo1 мне нужно все время устанавливать para1, потому что я должен передать дополнительные аргументы foo1.Это означает, что значение по умолчанию para1=1 не имеет никакого смысла, так как я все равно должен его определять.

Или есть какой-то другой способ определения функций, чтобы я мог легко использовать это значение по умолчаниюзначение без необходимости определять его все время?

Например,

wrapper(foo1, *args=(3,))
wrapper(foo=foo1, args=(3,))

не работает ...

Пример использования:

def wrapper(foo, timeout=10, *args):
    time0 = time.time()
    while time0 < time.time() + timeout:
        if foo(*args):
             return True
        time.sleep(1)
    raise SomeTimeout Exception

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Редактировать: Поскольку вы теперь ясно дали понять, что это для Python 2, def wrapper(foo, *args, timeout=10) выдаст вам синтаксическую ошибку.Поэтому используйте метод ниже:

Только с одним *args я не думаю, что это очень выполнимо.Если возможно, попробуйте вместо этого использовать **kwargs:

def wrapper(foo, *args, **kwargs):
    time0 = time.time()
    # define a default timeout period if not explicitly passed in by keyword
    timeout = kwargs.get('timeout') if 'timeout' in kwargs else 10
    while time0 < time.time() + timeout:
        if foo(*args):
            return True
        time.sleep(1)
    raise SomeTimeOut Exception

Каждый раз, когда вы хотите явно указать период ожидания, вызывайте его следующим образом:

wrapper(foo, 1, 2, 3, timeout=60)

Testкод :

def wrapper(foo, *args, **kwargs):
    timeout = kwargs.get('timeout') if 'timeout' in kwargs else 10
    print 'Timeout = {0}'.format(timeout)
    foo(*args)

def foo(*args):
    print 'Args = {0}'.format([a for a in args])

wrapper(foo, 1, 2, 3, timeout=20)

# Results
# Timeout = 20
# Args = [1, 2, 3]
0 голосов
/ 18 октября 2018

А как насчет этого?

#/usr/bin/env python3

def f1(f, *args, **kwargs):
    if not 'b' in kwargs:
        kwargs['b'] = 1
    print('b =',kwargs['b'])
    f(args)

def fx(args):
    print(args)

f1(fx, 3, 4)
print()
f1(fx, 3, 4, b=2)

Вывод:

b = 1                                                                     
(3, 4)

b = 2                                                                     
(3, 4)
0 голосов
/ 18 октября 2018

Вы определили функцию foo1 способом, который принимает число, но вы пытаетесь передать ему кортеж в функции wrapper.должно работать следующее:

def wrapper(foo, para1=1, *args):
    print("para1: "+ str(para1))
    print(foo(*args))



def foo1(*x):
    return 2*x


wrapper(foo1, (2, 3))

в определении foo1 x изменено на *x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...