我已经用名为--- 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秒后超时
有没有办法根据某些条件动态发送装饰器参数?
答案 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'''