0

我见过一些类似的代码:

nodeIds = Framework.getDataAsList(key) or []

它翻译成的完整代码片段是什么?是检查函数输出还是检查False结果None?有一些类似的Java语法吗?

4

7 回答 7

6

or短路。如果左边的表达式为“True”,则计算结果为,否则计算为右边的表达式(即使它是“False”)

如果左边的表达式是“真”,右边的表达式甚至不会被计算。如果它有副作用,这很重要

“真”意味着bool(expression) == True
“假”意味着bool(expression) == False

于 2012-08-15T07:27:23.327 回答
2

有伪代码:

def nonZero(var):
   if isinstance(var,collection): 
     if len(collection) == 0 : return False
     else: return True
   if isinstance(var, number):
     if number == 0 : return False
     else: return True
   if isinstance(var, boolean): return var
   if isinstance(var, NoneType): return False
   if hasattr(var,'__nonzero__'): return var.__nonzero__()


nodeIds = Framework.getDataAsList(key)
if not nonZero(nodeIds) : nodeIds = []
于 2012-08-15T07:19:20.617 回答
2

更长的版本(在 Python 中)可能是:

nodeIds = Framework.getDataAsList(key)
if not nodeIds:
    nodeIds = []

这可能几乎相同地翻译成Java:

Vector<foo> nodeIds = Framework.getDataAsList(key);
if(nodeIds == null) {
    nodeIds = new Vector<foo>();
}

(虽然我的 Java 很生锈;)

'not' 表达式中的某些值的计算结果为 False。您可以从交互式 Python 命令行自己尝试:

>>> not 0
... True
>>> not 1
... False
>>> not []
... True
>>> not ()
... True
>>> not True
... False
>>> not False
... True

希望这可以帮助。

于 2012-08-15T07:26:30.100 回答
1

假设Framework.getDataAsList(key)后续调用返回相同的结果,则等价于:

nodeIds = Framework.getDataAsList(key) if Framework.getDataAsList(key) else []

和:

if Framework.getDataAsList(key):
    nodeIds = Framework.getDataAsList(key)
else:
    nodeIds = []

但是请注意,这两个示例都需要两次调用Framework.getDataAsList(key)而不是一次。所以,也许更准确地说:

nodeIds = Framework.getDataAsList(key)
if not nodeIds:
    nodeIds = []
于 2012-08-15T07:12:56.973 回答
1
>>> 0 or "yes"
'yes'
>>> None or "yes"
'yes'
>>> False or "yes"
'yes'
>>> [] or "yes"
'yes'
>>> "no" or "yes"
'no'

因此,如果函数返回任何不是的值,__nonzero__()则分配一个空列表。另请参阅有关布尔运算符的短路行为的官方教程的这一部分andor. 有关 Python 中对象真值测试的更多信息,另请参阅此答案

注意:从 Python 3.0 开始,它__bool__()正在被测试。


对于 Java,这可能会使用三元运算符进行翻译:

result = Framework.getDataAsList(key);
nodeIds = result ? result : someEmptyList();

提供结果对象的等效布尔转换

于 2012-08-15T07:15:03.320 回答
0

检查它False。因此,如果Framework.getDataAsList(key)返回[]{}0""、 或任何其他计算结果为 的值,则将分配给。()NoneFalse[]nodeIDs

于 2012-08-15T07:13:23.830 回答
0

这个 Python 习语很常见,并且在赋值中使用很像其他类 c 语言中的三元运算符。

# python
var = value or fallback

相当于:

/* c-like */
var = value ? value : fallback

两者都等效于以下伪代码:

if value is true:
    var = value
else:
    var = fallback
于 2012-08-15T07:35:37.630 回答