Python:显式使用默认参数

8

在正常情况下,调用函数时通过省略参数来使用默认参数。但是,如果我需要实时生成参数,则不能轻松或优雅地省略一个参数。是否有一种方法可以显式地使用函数的默认参数?也就是说,传递一个指向默认参数的参数。

因此,类似于这样的东西,但要用聪明的方式替换~use default~

Translated:
在正常情况下,通过省略参数调用函数时,将使用默认参数。但是,如果我需要动态生成参数,则不总能轻松或优雅地省略其中的某一个参数。是否有一种方法可以显式地使用函数的默认参数?也就是说,传递一个指向默认参数的参数。因此,可以使用类似以下代码(但应替换为更智能的方法):
def function(arg='default'):
  print(arg)

arg_list= ['not_default', ~use default~ ]

for arg in arg_list:
  function(arg=arg)

# output:
# not_default
# default

我不知道这是否可行,而且由于术语“默认参数”,我的所有搜索结果都是编码入门教程。如果不支持此功能也可以,我只想知道。


我没有尝试过这个,但我认为应该可以动态实例化一个partial对象。请查看functools.partial - Selcuk
如果您正在即时生成参数,那么所有参数都应该有一个值,为什么不能直接使用它们呢? - wwii
你的目标函数只有一个参数可以接受多个值吗?如果你真的需要深入研究目标函数,而且如果你事先不知道它们或者不拥有该函数,也许可以查看 inspect 模块。https://dev59.com/Omcs5IYBdhLWcg3wtmWf - JL Peyret
2个回答

1

没有通用的方法可以省略参数;您可以通过显式传递适当的默认值来针对特定函数进行专门化,但除此之外,您唯一的选择就是未能传递该参数。

最接近的方法是使用省略相关参数的tupledict替换您的各个值,然后在调用时解包它们。因此,对于您的示例,您需要更改arglist的定义:

arg_list = [{'arg': 'not_default'}, {}]

然后像这样使用它:
for arg in arg_list:
    function(**arg)

当你不想传递参数时,一种稍微丑陋的方法是使用哨兵,在arg_list中使用它,并进行测试,例如:

USEDEFAULT = object()
arg_list = ['not_default', USEDEFAULT]

for arg in arg_list:
    if arg is USEDEFAULT:
        function()
    else:
        function(arg=arg)

显然不太干净,但可能更适用于特定的用例。

1
很遗憾,在Python中没有这样的功能。有一些变通方法,但它们并不是非常受欢迎。
简单而流行的模式是将默认值放入函数体中:
def function(arg=None):
    if arg is None:
        arg = 'default'
    ...

现在你可以省略参数或显式传递arg=None来采用默认值。

2
尽管如此,这假设None永远不会是一个有效的参数。 - ShadowRanger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接