【问题标题】:How to create a function with both default and arbitrary arguments如何创建具有默认参数和任意参数的函数
【发布时间】:2014-09-29 23:04:22
【问题描述】:

我正在尝试编写一个包含一些默认值的函数,并有可能发送一些额外的参数。例如,我想要这样的东西:

def defaultsAndArbitrary(arr, example1=True, example2=13, *modifiers):
    #code

然后,我希望能够像这样调用函数:

defaultsAndArbitrary([1,5,3,9], modifier1, modifier2)

通过该调用,参数的值应该是:

arr = [1,5,3,9]
example1 = True
example2 = 13
modifiers = (modifier1, modifier2)

这里有一个类似的问题:

Having arbitrary number of arguments with a named default in python

但它并没有真正回答这个问题(至少,据我所知)。甚至有可能做到这一点吗?

谢谢。

【问题讨论】:

    标签: python function arguments


    【解决方案1】:

    你可以这样做:

    def defaultsAndArbitrary(arr, *modifiers, **kwargs):
        example1 = kwargs.get('example1',True)
        example2 = kwargs.get('example2',13)
    

    【讨论】:

    • 我输入了这个,当我发送 example1 = False 时,它​​正确地将其更改为 False。为什么呢?对我来说, example1 = kwargs.get('example1', True) 是在读取参数后设置示例 1 的值,从而覆盖参数?
    • kwargs.get('example1', True)if 'example1' in kwargs: example1=kwargs['example1']; else: example1=True 相同。在计算此表达式时,kwargs 已通过函数调用设置。
    • 啊!说得通。谢谢!
    【解决方案2】:

    在 Python 3 中,您可以使用 keyword-only arguments。看起来像这样:

    def defaultsAndArbitrary(arr, *modifiers, example1=True, example2=13):
    

    在 Python 2 中,您必须使用您链接到的问题中给出的解决方案:您必须使用 **kwargs 并从 kwargs 字典中手动提取 example1example2,如果这些 kwargs 不是,则提供默认值通过了。这意味着您不能在函数签名中指定它们的名称或默认值;您必须在函数的代码中执行此操作。

    请注意,无论哪种情况,您的example1example2 变量必须通过关键字传递(如果您想为它们传递值而不是使用默认值);它们不能按位置传递。

    【讨论】:

    • 好的,我使用的是 Python 2.7,所以我想我不能使用第一种方法:/ 所以在第二种情况下,如何声明默认值而不覆盖传入的参数?
    • @user2869231:您链接到的问题已经显示了如何做到这一点(就像 muraveil 的回答一样)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2018-02-09
    • 2012-01-11
    相关资源
    最近更新 更多