[英]How to pass argument to decorator dynamically based on certain condition in 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到decorator的关键字。
意思是,如果keyword =='this_one',则real_time_reading函数应在30秒后超时;如果keyword =='that_one',则real_time_reading函数应在60秒后超时。
有没有一种方法可以根据特定条件动态发送装饰器参数?
不,在解析函数时会初始化装饰器。 可能存在动态更改(修改)它的方法,但这会产生不良后果。
我建议使用两个功能:
"""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'''
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.