[英]Proper use of the * operator in a oneline if statement python
我想知道是否可以在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)
是的,您需要提供一个空序列 ,而不是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语句”。
一个更简洁的解决方案,尽管语义略有不同:
return_val = funct(*node['args'] or ())
如果bool(node['args'])
计算结果为False
,则空元组()
将被解包(无任何)并传递; 否则, node['args']
将被解压缩并传递。
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
使用逻辑快捷方式可以实现所需的语法:
return_val = funct(*node['args'] or ())
当然, node['args']
应该是序列或None
,而不是例如零。
在Python中, None
在逻辑上是False
,所以or
操作将返回第二个操作数 - ()
。 如果第一个参数不为空, or
将返回它而不评估第二个操作数。
另外值得注意的是*
不是运营商。 它是一种为函数提供位置参数的语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.