【问题标题】:Python: explicitly use default argumentsPython:显式使用默认参数
【发布时间】:2019-08-28 02:16:11
【问题描述】:

在正常情况下,通过省略这些参数来调用带有默认参数的函数。但是,如果我在动态生成参数,省略一个并不总是容易或优雅的。有没有办法显式使用函数的默认参数?也就是说,传递一个指向默认参数的参数。

除了将~use default~ 替换为智能的东西之外,其他类似的东西。

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 object。看看functools.partial。
  • 如果您正在动态生成参数,您不是对所有参数都有价值吗?为什么不能直接使用它们?
  • 你的目标函数是否只有 1 个可以取多个值的参数?如果您确实需要深入了解目标功能并且您不提前了解它们或不拥有该功能,则可以查看 inspect 模块。 stackoverflow.com/questions/12627118/…

标签: python default-arguments


【解决方案1】:

不幸的是,Python 中没有这样的功能。有一些hackarounds,但它们不是很讨人喜欢。

简单流行的模式是将默认值移动到函数体中:

def function(arg=None):
    if arg is None:
        arg = 'default'
    ...

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

【讨论】:

  • 虽然这确实假设None 永远不可能是一个有效的参数。
【解决方案2】:

没有通用的方法可以省略参数;您可以通过显式传递适当的默认值来专门针对特定函数,否则,您唯一的选择就是不传递参数。

您最接近的方法是用省略相关参数的tuples 或dicts 替换您的个人值,然后在调用时解压缩它们。因此,对于您的示例,您可以将 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)

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

【讨论】:

    猜你喜欢
    • 2017-11-29
    • 2018-10-07
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2018-11-16
    相关资源
    最近更新 更多