Редактировать: Поскольку вы теперь ясно дали понять, что это для 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)
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]