Python 2.7 如何在单行if-else python语句中惰性地计算值?

Python 2.7 如何在单行if-else python语句中惰性地计算值?,python-2.7,lazy-evaluation,Python 2.7,Lazy Evaluation,这是python代码 current_task.request.task if current_task is not None else None current_task可以是None,但python会在检查条件之前对语句进行求值。这就是为什么我会出现这个错误: AttributeError: 'NoneType' object has no attribute 'request' 是否仍要对当前任务.request.task进行延迟评估 更新 我想我被当前任务的输出和类型弄糊涂了 &g

这是python代码

current_task.request.task if current_task is not None else None
current_task
可以是
None
,但python会在检查条件之前对语句进行求值。这就是为什么我会出现这个错误:

AttributeError: 'NoneType' object has no attribute 'request'
是否仍要对当前任务.request.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.
打印类型(当前任务) >> >>打印当前任务 >>None#显然,它调用u str_u()来转储当前案例的None。
提前感谢,非常感谢您的帮助

这里有点混乱

>>> 1/0 if 0 else 12
12
看到了吗?无
zero错误
<代码>。。。如果否则…已短路

或:


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

这里有点混乱

>>> 1/0 if 0 else 12
12
看到了吗?无
zero错误
<代码>。。。如果否则…已短路

或:


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

我认为问题在于当前任务设置了一些内容,只是没有设置为
None

你的表达相当于

if current_task is not None:
   current_task.request.task 
else:
  None
因此,如果
current_task
设置为any值,而不是
None

或者,我相信你可以将这个表达式改写为

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

  • None
  • False
  • 任何数字类型的零,例如,
    0
    0L
    0.0
    0j
  • 任何空序列,例如,
    '
    ()
    []
  • 任何空映射,例如,
    {}
  • 用户定义类的实例,如果该类定义了
    \uuu非零\uuu()
    \uu len\uuu()
    方法,则该方法返回整数
    0
    或布尔值
    False

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

current_task.request.task if current_task.__str__() != 'None' else None

我认为问题在于当前任务设置为某个值,而不是设置为无

你的表达相当于

if current_task is not None:
   current_task.request.task 
else:
  None
因此,如果
current_task
设置为any值,而不是
None

或者,我相信你可以将这个表达式改写为

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

  • None
  • False
  • 任何数字类型的零,例如,
    0
    0L
    0.0
    0j
  • 任何空序列,例如,
    '
    ()
    []
  • 任何空映射,例如,
    {}
  • 用户定义类的实例,如果该类定义了
    \uuu非零\uuu()
    \uu len\uuu()
    方法,则该方法返回整数
    0
    或布尔值
    False

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

current_task.request.task if current_task.__str__() != 'None' else None

你的例子应该按原样工作。例如,这是有效的

a = 'String'
a.lower() if a else None
a = None
a.lower() if a else None

你的例子应该按原样工作。例如,这是有效的

a = 'String'
a.lower() if a else None
a = None
a.lower() if a else None

您使用的是什么版本的Python?在2.5.1、2.7.4和3.3.0上运行该行都会产生您想要的延迟结果。@jwodder我使用的是python 2.7.5。更新了它。但它在我的本地应用程序上不起作用。结果:是的,如果else是lazy,那么只有一行。您使用的是什么版本的Python?在2.5.1、2.7.4和3.3.0上运行该行都会产生您想要的延迟结果。@jwodder我使用的是python 2.7.5。更新了它。但它在我的本地服务器上不起作用。结果:是的,如果else是惰性的,则只有一行。有哪些值不是
None
,但属于
NoneType
?还可以尝试其他方法:如果代理显示为
None
,则它可能与
None
,因此请尝试测试
当前任务!=无
。这与
不是
测试非常不同。有哪些值不是
,但属于
非类型
?还有一些需要尝试的东西:如果代理显示自己为
,它可能与
,那么请尝试测试
当前任务!=无
。这与
不是测试非常不同。