У меня есть подпрограмма, которая должна вызывать ряд других функций и применять тайм-аут для этих функций. Я использую пакет timeout_decorator. Предположим, у меня есть глобальная переменная "timeout" со значением по умолчанию 120 (секунд). Мне нужно иметь возможность переопределить это в каждом конкретном случае через аргумент командной строки.
Мне кажется, что простое использование декоратора не обеспечивает опцию переопределения. Например,
@timeout_decorator.timeout(timeout)
def my_function_not_allowed_to_run_too_long(stuff):
etc...
будет иметь значение по умолчанию для тайм-аута, которое нельзя переопределить, так как декоратор оценивается до обработки командной строки.
Я реализовал следующее:
class CallFuncWithTimeout(object):
def __init__(self, func):
self.func = func
@timeout_decorator.timeout(timeout)
def doit(self, *args, **kwargs):
res = self.func(*args, **kwargs)
return res
, который можно назвать следующим образом:
my_func = CallFuncWithTimeout(my_function_not_allowed_to_run_too_long)
try:
res = my_func.doit(stuff)
except timeout_decorator.timeout_decorator.TimeoutError:
# handle timeout...
Кажется, он работает; Я предполагаю, потому что класс не создается до тех пор, пока не будет обработана командная строка, и, следовательно, переменная «timeout» в классе отражает значение командной строки.
Мой вопрос: это самый чистый способ получить эту функциональность ? Я что-то упустил?