Python celery any()语句在任务中给出错误的结果
我在芹菜任务self.resdict['jobs']中运行了以下代码,其中包含一系列子任务,我正在while循环中检查它们的状态Python celery any()语句在任务中给出错误的结果,python,celery,Python,Celery,我在芹菜任务self.resdict['jobs']中运行了以下代码,其中包含一系列子任务,我正在while循环中检查它们的状态 while any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']): print([x.status for x in self.resdict['jobs'].values() if x.status is not '
while any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']):
print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])
print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']))
time.sleep(.5)
else:
for a in self.resdict['accounts'][0]['result']:
account = a['number'] if isinstance(a['number'], str) else False
self.resdict[account] = self.resdict['jobs'][account].result[0]['result'][0]['Device Information']['subattributes']
当我使用CELERY\u ALWAYS\u Eanger=True和CELERY\u Eanger\u PROPAGATES\u EXCEPTIONS=True运行此代码时,如果列表中包含所有“SUCCESS”,它将给出我期望的结果
因此,当我总是渴望跑步时,我得到了什么:
print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']) = ['SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS']
print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])) = False
当我运行时,没有始终渴望,在芹菜调试中,我看到:
print([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS']) = ['SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS', 'SUCCESS']
print(any([x.status for x in self.resdict['jobs'].values() if x.status is not 'SUCCESS'])) = True
这是不正确的,因为列表中只包含“SUCCESS”
你知道为什么芹菜说的是真的而它应该是假的吗?你不应该将字符串与
is
进行比较。它有时可能会起作用,因为一些字符串将被Python解释器“插入”并缓存,但这种缓存并不能保证在所有情况下都会发生。相反,您应该使用==
而不是is
和,通过值而不是身份进行比较=代替的code>不是
这应该可以解决您当前的问题,但我进一步建议您似乎没有以非常有用的方式使用any
。any
函数在iterable参数中的第一个值为truthy后返回True
。如果您只是想测试一个空列表,请跳过any
,并将列表本身用作布尔值。空列表是错误的,而包含任何元素(不管这些元素的值)的列表是真实的
如果您不首先建立一个列表,那么使用any
将更有意义。这是因为any
短路,在第一个真实结果之后停止,而不检查其余的iterable。这使得它与生成器非常匹配,生成器只根据需要延迟计算其值。只需删除方括号,即可将列表替换为生成器表达式。但在这种情况下,我建议更改代码,使生成器生成bool
s,而不是值或无:any(x.status!=“Success”代表self.resdict['jobs'].values())