2

我正在尝试添加一个带有装饰器的函数来安排其执行,但出现以下错误:

ValueError: This Job cannot be serialized since the reference to its callable (<function inner at 0x7f1c900527d0>) could not be determined. Consider giving a textual reference (module:function name) instead.

我的功能是

@my_decorator
def my_function(id=None):
   print id

我添加如下:

my_scheduler.add_job(function, 'interval',minutes=1)

是否可以使用装饰器添加功能?有任何想法吗?

作为一种解决方法,我可以定义一个内部定义并调用我的装饰器,但我认为它是不好的解决方案,我更喜欢直接使用它

解决方法:

def outer(id=None):
   @my_decorator
   def my_function(id=None):
      print id

   my_function(id)

my_scheduler.add_job(outer, 'interval',minutes=1)
4

2 回答 2

1

经过一些试验和错误后,我设法用以下方法做我想做的事:

from functools import wraps

def my_decorator():
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # do stuff
        return wrapper
    return decorator

现在当触发器由 apsScheduler 触发时调用装饰器

问题是我们使用@wraps 处理幼稚的内省,即我们更新包装函数以看起来像被包装的函数

于 2015-08-18T07:49:45.993 回答
0

add_job() 方法接受对您的可调用对象的字符串引用。所以:

my_scheduler.add_job('the.module:my_function', 'interval', minutes=1)
于 2015-08-17T18:40:38.760 回答