繁体   English   中英

在oneline if语句python中正确使用*运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM