Pythoni c использование декоратора тайм-аута с переменным тайм-аутом - PullRequest
1 голос
/ 06 марта 2020

У меня есть подпрограмма, которая должна вызывать ряд других функций и применять тайм-аут для этих функций. Я использую пакет 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» в классе отражает значение командной строки.

Мой вопрос: это самый чистый способ получить эту функциональность ? Я что-то упустил?

...