(Python 2.7)由于装饰者不能与他们正在装饰的函数共享变量,我如何将object_list
传递给装饰函数?我有一些将使用raw_turn_over_mailer()
装饰器的函数,如果可能的话,我想将object_list
保留到本地修饰函数中。
def raw_turn_over_mailer(function):
@wraps(function)
def wrapper(requests):
original_function = function(requests)
if object_list:
....
return original_function
return wrapper
@raw_turn_over_mailer
def one(requests):
object_list = [x for x in requests
if x.account_type.name == 'AccountType1']
@raw_turn_over_mailer
def two(requests):
object_list = [x for x in requests
if x.account_type.name == 'AccountType2']
@periodic_task(run_every=crontab(hour="*", minute="*", day_of_week="*"))
def turn_over_mailer():
HOURS = 1000
requests = Request.objects.filter(completed=False, date_due__gte=hours_ahead(0), date_due__lte=hours_ahead(HOURS))
if requests:
one(requests)
two(requests)
答案 0 :(得分:1)
我实际上无法运行它,但我认为它会做你想要的,它创建一个wrapper()
函数调用原始函数(现在只返回一个对象列表),然后对它进行后处理(但本身不返回):
from functools import wraps
def raw_turn_over_mailer(function):
@wraps(function)
def wrapper(requests):
object_list = function(requests) # call original
if object_list:
#....
return wrapper
@raw_turn_over_mailer
def one(requests):
return [x for x in requests if x.account_type.name == 'AccountType1']
@raw_turn_over_mailer
def two(requests):
return [x for x in requests if x.account_type.name == 'AccountType2']
这似乎是一种处理调用函数结果的复杂方法。您可以调用后处理函数并将其传递给函数以调用以获取对象列表。