我见过类似的代码:
nodeIds = Framework.getDataAsList(key) or []
它翻译成的完整代码片段是什么?是否检查了False
或None
结果的功能输出?是否有类似的Java语法?
答案 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有关布尔运算符and
和or
的短路行为。另请参阅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