我见过一些类似的代码:
nodeIds = Framework.getDataAsList(key) or []
它翻译成的完整代码片段是什么?是检查函数输出还是检查False
结果None
?有一些类似的Java语法吗?
or
短路。如果左边的表达式为“True”,则计算结果为,否则计算为右边的表达式(即使它是“False”)
如果左边的表达式是“真”,右边的表达式甚至不会被计算。如果它有副作用,这很重要
“真”意味着bool(expression) == True
“假”意味着bool(expression) == False
有伪代码:
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 = []
更长的版本(在 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
希望这可以帮助。
假设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 = []
>>> 0 or "yes"
'yes'
>>> None or "yes"
'yes'
>>> False or "yes"
'yes'
>>> [] or "yes"
'yes'
>>> "no" or "yes"
'no'
因此,如果函数返回任何不是的值,__nonzero__()
则分配一个空列表。另请参阅有关布尔运算符的短路行为的官方教程的这一部分and
和or
. 有关 Python 中对象真值测试的更多信息,另请参阅此答案。
注意:从 Python 3.0 开始,它__bool__()
正在被测试。
对于 Java,这可能会使用三元运算符进行翻译:
result = Framework.getDataAsList(key);
nodeIds = result ? result : someEmptyList();
检查它False
。因此,如果Framework.getDataAsList(key)
返回[]
、{}
、0
、""
、 或任何其他计算结果为 的值,则将分配给。()
None
False
[]
nodeIDs
这个 Python 习语很常见,并且在赋值中使用很像其他类 c 语言中的三元运算符。
# python
var = value or fallback
相当于:
/* c-like */
var = value ? value : fallback
两者都等效于以下伪代码:
if value is true:
var = value
else:
var = fallback