【问题标题】:celery does not work with inheritance and properties decoratorcelery 不适用于继承和属性装饰器
【发布时间】:2014-02-15 10:11:01
【问题描述】:

我正在尝试对 celery 使用继承

这是我的课程:

class A(object):
  @property
  def var(self):
    return self._var

  @var.setter
  def var(self, value):
    self._var = value

  def b(self):
    self.var = 'b'

class B(A):
  @celeryapp.task(name='B.b', filter=task_method)
  def b(self):
    super(B, self).b()

这是我的主要代码:

# instanciate B
instb = B()
# Send a task to celery
instb.b.delay()

Celery 输出日志:

[2014-01-24 12:48:11,407: INFO/MainProcess] Received task: B.b[57833124-7691-443a-ad5a-d7caea4578d3]

到目前为止一切都很好,但是当我尝试获取 var 属性时

print instb.var()
# or
print instb.var

蟒蛇说:

AttributeError: 'B' object has no attribute '_var'

有人可以向我解释为什么它不起作用? 谢谢

【问题讨论】:

  • 你应该试试b.var()
  • var@property,所以var() 将给出TypeError

标签: python inheritance properties celery decorator


【解决方案1】:

AB 都没有__init__ 方法,这意味着_var 属性在instance.b() 运行或instance.var(或直接分配instance._var)之前不存在。您可以初始化此属性以避免错误:

class A(object):
    def __init__(self):
        self._var = None

但是,更广泛的问题是您期望 b() 在您调用 print b.var 时已经运行(不应该是 instb.var 吗?)您需要获得任务的结果然后等待它完成:

result = instb.b.delay()
result.get()
print instb.var

请参阅AsyncResultcalling tasks 上的文档。

【讨论】:

  • 你说得对,我想要的是 instb.var()。但这是一个复制/粘贴错误。我会尝试初始化类。
  • 初始化一个类允许确实避免 AttributeError。但是 instb.var 设置为 None 而不是 'b'。
  • 是的,那是因为 b 方法实际上还没有被调用。阅读我的答案后半部分发布的链接。
  • b 方法被正确调用,如果我在里面放一个 print 就可以了,我会在 celery 输出中看到它。但是当我想为我的实例添加一个属性时,无论它是什么,它都不会保存该属性。
  • 那么也许 celery 提供了一个 instb 的副本,它会发生变异,而原始文件保持不变。你可能需要重构你的代码以明确地return你需要从任务中得到什么。
猜你喜欢
  • 2014-03-07
  • 2011-03-01
  • 2018-04-17
  • 2012-04-22
  • 2011-03-23
  • 2011-09-18
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多