有条件地将任意数量的默认命名参数传递给函数

11 python function shorthand

是否有可能有条件地将任意数量的命名默认参数传递给Python函数?

例如.有一个功能:

def func(arg, arg2='', arg3='def')
Run Code Online (Sandbox Code Playgroud)

现在的逻辑是我有一个条件来确定是否需要传递arg3,我可以这样做:

if condition == True:
    func('arg', arg2='arg2', arg3='some value')
else:
    func('arg', arg2='arg2')
Run Code Online (Sandbox Code Playgroud)

问题是,我可以用速记如下:

func('arg', 'arg2', 'some value' if condition == True else # nothing so default gets picked
)
Run Code Online (Sandbox Code Playgroud)

Sil*_*ost 9

这不是有效的Python语法,你必须拥有一些东西else.通常做的是:

func('arg', 'arg2', 'some value' if condition else None)
Run Code Online (Sandbox Code Playgroud)

和功能定义相应改变:

def func(arg, arg2='', arg3=None):
    arg3 = 'def' if arg3 is None else arg3
Run Code Online (Sandbox Code Playgroud)


Sve*_*ach 7

我能想到的唯一方法就是

func("arg", "arg2", **({"arg3": "some value"} if condition == True else {}))
Run Code Online (Sandbox Code Playgroud)

要么

func("arg", "arg2", *(("some value",) if condition == True else ()))
Run Code Online (Sandbox Code Playgroud)

但请不要这样做.使用您自己提供的代码,或类似的代码:

if condition:
   arg3 = "some value",
else:
   arg3 = ()
func("arg", "arg2", *arg3)
Run Code Online (Sandbox Code Playgroud)

  • 你对**和*有什么打击? (2认同)
  • 什么都不反对`*`和`**`.我只是认为原始代码更具可读性.我想我不喜欢`a if c else b`. (2认同)

Wil*_*uck 5

如果您的函数有很多默认参数

def lots_of_defaults(arg1 = "foo", arg2 = "bar", arg3 = "baz", arg4 = "blah"):
    pass
Run Code Online (Sandbox Code Playgroud)

并且您希望根据程序中发生的其他情况向其中一些传递不同的值,一种简单的方法是使用**您根据程序逻辑构造的参数名称和值的字典来解包。

different_than_defaults = {}
if foobar:
    different_than_defaults["arg1"] = "baaaz"
if barblah:
    different_than_defaults["arg4"] = "bleck"

lots_of_defaults(**different_than_defaults)
Run Code Online (Sandbox Code Playgroud)

如果有很多逻辑决定调用的内容,那么这样做的好处是不会在调用函数时阻塞代码。如果您有任何没有默认值的参数,您需要小心,以在传递字典之前包含您为这些参数传递的值。