如何根据python中的某些条件动态地将参数传递给装饰器?

时间:2016-11-23 10:56:13

标签: python

我已经用名为--- timeout.py。

的文件编写了一个超时装饰器函数
from functools import wraps
import errno
import os
import signal

class TimeoutError(Exception):
    pass

def timeout(seconds=10, error_message=os.strerror(errno.ETIME)):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeoutError(error_message)
        @wraps(func)
        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wrapper

    return decorator

现在我有另一个文件在不同的文件中包含以下代码

"""some code at the starting"""
if keyword == 'this_one':
    real_time_reading(this_one)    #how to send timeout_in_seconds dynamically
elif keyword == 'that_one':
    real_time_reading(this_one)

@timeout(timeout_in_seconds)
def real_time_reading(keyword):
    '''Here it does some operations and if there is no input
       it times out based on the timeout_in_seconds value given
       to decorator'''

我的要求是基于我想向装饰者发送timeout_in_seconds的关键字。

含义,如果关键字==' this_one'那么,real_time_reading函数应该在30秒后超时,如果关键字==' that_one'那么,real_time_reading函数应该在60秒后超时

有没有办法根据某些条件动态发送装饰器参数?

1 个答案:

答案 0 :(得分:1)

不,解析函数时会初始化装饰器。可能存在动态改变(破解)它的方法,但这会产生不希望的后果。

我建议使用两个功能:

"""some code at the starting"""
if keyword == 'this_one':
    real_time_reading_this_one(keyword)
elif keyword == 'that_one':
    real_time_reading_that_one(keyword)

@timeout(timeout_in_seconds)
def real_time_reading_this_one(keyword)
    return _real_time_reading(keyword);

@timeout(timeout_in_seconds * 2)
def real_time_reading_that_one(keyword)
    return _real_time_reading(keyword);

def _real_time_reading(keyword):
    '''Here it does some operations and if there is no input
       it times out based on the timeout_in_seconds value given
       to decorator'''