【问题标题】:Passing function parameter name to another function in Python将函数参数名称传递给Python中的另一个函数
【发布时间】:2017-09-27 18:14:03
【问题描述】:

给定一个简单的函数:

def A(a = 1, b = 2):
    return a+b

我想为ab 编写另一个函数来更改默认参数值。用户可以通过设置var = avar = b 来指定要更改的参数。例如:

def B(var = 'a', new_value = 10):
    temp_dict = {var:new_value}
    ans = A(var)
    return ans    

def B(var = 'a', new_value = 10):
    ans = A(var = new_value)
    return ans

在函数def B()中,设置var = avar = new_value = 10后,我希望A(var = new_value)能达到和A(a = 10)一样的效果。你知道函数def B()的正确写法吗? 谢谢。

【问题讨论】:

    标签: python function-parameter


    【解决方案1】:

    你快到了。在您的B() 函数中,在调用A() 时,您需要解压缩temp_dict 并将其作为参数传递给A()。见下文:

    >>> def A(a = 1, b = 2):
    ...     return a+b
    ...
    
    >>> def B(var = 'a', new_value = 10):
    ...     temp_dict = {var:new_value}
    ...     ans = A(**temp_dict)
            #        ^ unpack the dict, and pass it as an argument
    ...     return ans
    ...
    
    >>> B()
    12
    

    有关此 ** 如何与 dict 一起使用的更多详细信息,请查看:

    【讨论】:

      【解决方案2】:

      我冒昧地解释了 OP 所说的他想要的内容,即 更改 a 或 b 的默认参数值。所以我所做的是返回一个转换后的函数 A,其中 a 或 b 默认值通过部分更改:

      from functools import partial
      
      def B3(var ="a", new_value=10):
          return partial(A, **{var:new_value})
      

      样本输出:

      (Pdb) f = B3("a",10)
      (Pdb) f()
      12
      (Pdb) f = B3("b",10)
      (Pdb) f()
      11
      (Pdb) f(a=10)
      20
      (Pdb) f(b=13)
      14
      (Pdb) f(a=5,b=5)
      10
      

      然而,这与请求的第二部分不同,它具有基于 B(var="a",new_value=10) 的东西作为函数签名。

      唯一的问题是,如果你不使用关键字参数,它会很高兴地窒息:

      (Pdb) f(7,7)
      *** TypeError: A() got multiple values for keyword argument 'b'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-19
        • 2010-10-22
        • 1970-01-01
        • 2012-08-02
        • 2019-07-25
        • 2012-09-25
        相关资源
        最近更新 更多