【问题标题】:Using default arguments in a function with variable arguments. Is this possible?在具有可变参数的函数中使用默认参数。这可能吗?
【发布时间】:2023-03-19 04:27:01
【问题描述】:

我有以下代码。在此,我想利用给'a'的可选参数;即“5”,而不是“1”。如何使元组“数字”包含第一个元素为 1 而不是 2?

def fun_varargs(a=5, *numbers, **dict):
    print("Value of a is",a)
    for i in numbers:
        print("Value of i is",i)
    for i, j in dict.items():
        print("The value of i and j are:",i,j)

fun_varargs(1,2,3,4,5,6,7,8,9,10,Jack=111,John=222,Tom=333)

【问题讨论】:

    标签: python


    【解决方案1】:

    执行此操作的“惯用”Python 方法是将可选参数默认为 None

    def fun_varargs(a=None, *numbers, **dict):
      if a is None:
        a = 5
      ...
    

    那你可以明确选择不通过。

    fun_varargs(None, 1, 2, 3, 4, 5, some_keyword_arg=":)")
    

    我不知道实际上选择不传递可选参数的方法。如果您正在寻找实用的解决方案,这就是您要走的路。但是,如果有一些更深层次的黑客可以让你完全绕过这个论点,我也会有兴趣看到它。

    【讨论】:

      【解决方案2】:

      .__defaults__ 属性在元组中提供默认参数。你可以在这里使用它。

      >>> def fun_varargs(a = 5, *numbers, **dict):
      ...     print("value of a is", a)
      ...     for i in numbers:
      ...             print("value of i is", i)
      ...     for i, j in dict.items():
      ...             print("The value of i and j are:", i,j)
      ... 
      
      >>> fun_varargs(fun_varargs.__defaults__[0],1,2,3,4,5,6,7,8,9,10,Jack=111,John=222,Tom=333)
      value of a is 5
      value of i is 1
      value of i is 2
      value of i is 3
      value of i is 4
      value of i is 5
      value of i is 6
      value of i is 7
      value of i is 8
      value of i is 9
      value of i is 10
      The value of i and j are: Jack 111
      The value of i and j are: John 222
      The value of i and j are: Tom 333
      

      【讨论】:

        【解决方案3】:

        一种选择是将a 移动到*numbers 之后

        def fun_varargs(*numbers, a=5, **dict):
            ...
        

        但是,您不能再将其用作位置参数。 fun_varargs(42) 不会将a 设置为42。您只能使用关键字参数定义a,即fun_varargs(a=42)

        【讨论】:

        • 如果我交换参数的位置,对于上面的代码,输出是 - 数字 1 到 10 被分配给元组“数字”。为什么编译器不将 1-9 分配给“数字”,将 10 分配给“a”,其余的分配给字典?
        • a 在这种情况下不再是位置参数。您必须使用关键字 (a) 来定义它。如果函数定义为def fun_varargs(*numbers, **dict, a=5),情况也是一样。
        猜你喜欢
        • 1970-01-01
        • 2011-05-07
        • 2015-05-19
        • 2019-09-12
        • 1970-01-01
        • 2011-04-01
        • 2011-04-18
        • 2014-04-28
        相关资源
        最近更新 更多