1

这是python代码

current_task.request.task if current_task is not None else None

current_task可能是None,但 python 在检查条件之前评估语句。这就是我收到此错误的原因:

AttributeError: 'NoneType' object has no attribute 'request'

反正有懒惰的评价current_task.request.task吗?

更新

我想我对 current_task 的输出和类型感到困惑。

>>print type(current_task)
>><class 'celery.local.Proxy'>

>>print current_task
>>None                  #obviously it calls __str__() to dump the None instead for the current case.

提前致谢,非常感谢您的帮助!

4

3 回答 3

2

这里有些混乱!

>>> 1/0 if 0 else 12
12

看?没有ZeroDivisionError... if ... else ...已经短路了。

或者:

>>> current_task = None
>>> print current_task.request.task if current_task is not None else None
None

所以我不相信你;-) 发布更多细节,比如实际的终端会话,就像我为你所做的那样。

于 2013-10-09T20:55:50.423 回答
2

我认为问题是current_task设置为某些东西,而不是设置为None.

你的表达相当于

if current_task is not None:
   current_task.request.task 
else:
  None

current_task.request如果current_task设置为_None

或者,我相信您可以将此表达式重写为

current_task and current_task.request.task

只要current_task不是以下任何值, Python 将继续执行表达式的后半部分

  • None
  • False
  • 任何数字类型的零,例如, 0, 0L, 0.0,0j
  • 任何空序列,例如'', (),[]
  • 任何空映射,例如,{}
  • 用户定义类的实例,如果该类定义了一个__nonzero__()or__len__()方法,当该方法返回整数0或布尔值时False

根据您的更新,这感觉有点难看,但您可以这样做

current_task.request.task if current_task.__str__() != 'None' else None
于 2013-10-09T20:56:51.083 回答
0

您的示例应该按原样工作。例如,这有效。

a = 'String'
a.lower() if a else None
a = None
a.lower() if a else None
于 2013-10-09T20:57:08.697 回答