我想知道是否可以在oneline上使用*运算符来实现以下功能:
if node['args'] != None:
return_val = funct(*node['args'])
else:
return_val = funct()
我以为我可以说
return_val = funct(*node['args'] if node['args'] != None else None)
但事实证明这与说
相同if node['args'] != None:
return_val = funct(*node['args'])
else:
return_val = funct(*None)
对*None
没有任何意义。
我厌倦了括号中的第一个选项,但这只会引发SyntaxError: can't use starred expression here
return_val = funct((*node['args']) if node['args'] != None else None)
答案 0 :(得分:4)
是的,您需要提供空序列,而不是None
:
>>> def f(*args):
... for arg in args:
... print(arg)
...
>>> x = None
>>> y = ('a','b')
>>> f(*(y if x is not None else ()))
>>> x = object()
>>> f(*(y if x is not None else ()))
a
b
但我认为你的if -else
陈述方法更为可取。我只需要看一次,我立即知道发生了什么。使用条件表达式,我必须考虑它。
此外,这是一个条件表达式,而不是"一行if语句"。
答案 1 :(得分:3)
更简洁的解决方案,尽管语义略有不同:
return_val = funct(*node['args'] or ())
如果bool(node['args'])
评估为False
,则空元组()
将被解包(无效)并通过;否则,node['args']
将被解压缩并通过。
答案 2 :(得分:1)
node['args']
可以是tuple
(或序列)或None
。
如果您的功能定义如下:
def funct(*args):
return ...
您可以通过解压缩node['args']
来调用它。
但是,如果node['args']
为None
,则必须使用空元组()
(或空序列)替换。
您可以使用*(node['args'] or ())
调用您的函数,如下所示:
return_val = funct(*(node['args'] or ()))
<强>演示强>
def funct(*args):
return len(args)
for node in [{'args': (1, 2, 3)}, {'args': None}]:
return_val = funct(*(node['args'] or ()))
print(return_val)
你得到:
3
0
答案 3 :(得分:0)
使用逻辑快捷方式可以实现所需的语法:
return_val = funct(*node['args'] or ())
当然,node['args']
应该是一个序列或None
,而不是,例如,零。
在Python中,None
逻辑False
,因此or
操作将返回第二个操作数 - ()
。如果第一个参数不为空,or
将返回它而不评估第二个操作数。
另外值得注意的是*
不是运营商。它是一种为函数提供位置参数的语法。