使用或的Python赋值

时间:2012-08-15 07:09:46

标签: java python jython

我见过类似的代码:

nodeIds = Framework.getDataAsList(key) or []

它翻译成的完整代码片段是什么?是否检查了FalseNone结果的功能输出?是否有类似的Java语法?

7 个答案:

答案 0 :(得分:6)

or短路。它左边的表达式是“True”,对它进行求值,否则它会计算到右边的表达式(即使它是“False”)

如果左边的表达式为“True”,则右边的表达式甚至不会被评估。如果它有副作用,这很重要

“True”表示bool(expression) == True
“False”表示bool(expression) == False

答案 1 :(得分: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 = []

答案 2 :(得分: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

希望这有帮助。

答案 3 :(得分: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 = []

答案 4 :(得分:1)

>>> 0 or "yes"
'yes'
>>> None or "yes"
'yes'
>>> False or "yes"
'yes'
>>> [] or "yes"
'yes'
>>> "no" or "yes"
'no'

因此,如果函数返回任何不是__nonzero__()的值,则会分配一个空列表。另请参阅this part of the official tutorial有关布尔运算符andor的短路行为。另请参阅this answer以获取有关Python中对象的真值测试的更多信息。

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


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

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

Provided the equivalent boolean conversion of your result object

答案 5 :(得分:0)

检查False。因此,如果Framework.getDataAsList(key)返回[]{}0""()None或任何其他评估为的值False,然后[]将被分配到nodeIDs

答案 6 :(得分:0)

这种Python习惯用法很常见,用于赋值,就像其他类c语言的三元运算符一样。

# python
var = value or fallback

相当于:

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

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

if value is true:
    var = value
else:
    var = fallback