【问题标题】:Python set parameter value for subsequent function callsPython为后续函数调用设置参数值
【发布时间】:2019-04-02 09:13:45
【问题描述】:

Python 中是否有一个选项可以为某些函数定义参数值,以便在调用上述函数时使用这些值?

TF Slim 中的类似内容:https://www.tensorflow.org/api_docs/python/tf/contrib/framework/arg_scope

例子:

set_default_params(functions=[func_1, func_2], params=[param_1=value_1, param_2=value_2, param_3=value_3])

之后,当我调用具有默认参数param_1=0param_2=Nonefunc_1() 时,它实际上会得到param_1=value_1param_2=value_2,而无需在调用func_1() 时手动设置它。

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用functools.partial 设置默认参数。这部分地将参数应用于给定的函数。

    import functools
    
    def func(param, *args, **kwargs):
        print('param:', param)
        print('args:', *args)
        print('kwargs:', kwargs)
    
    g = functools.partial(func, 21)      # sets default value for param to 21
    g('arg1', 'arg2', 'arg3', kw='kwarg1')
    

    输出:

    param: 21
    args: arg1 arg2 arg3
    kwargs: {'kw': 'kwarg1'}
    

    请注意,functools.partial 会返回一个新函数,并且默认参数不会像您的 set_default_params 调用所暗示的那样就地设置。

    【讨论】:

    • 不应该 func 是 functools.partial 调用中的第一个参数吗?我没有看到该函数在任何地方被引用。
    • @ChristophBurschka 啊,是的。我应该先测试一下代码。 :P 谢谢你的收获。
    【解决方案2】:

    如果你希望以后能够设置参数,你可以使用某种装饰器来做到这一点。

    def kind_of_decorator(func, params):
        def wrapper(*args, **kwargs):
            return func(*args, **dict(kwargs, **params))
        return wrapper
    
    def foo(x, y=2):
        return x + y
    
    print(foo(1, 5)) # prints 6
    print(foo(3))    # prints 5
    
    new_foo = kind_of_decorator(foo, {'y': 0})
    
    print(new_foo(1, y=5))  # prints 6
    print(new_foo(3))       # prints 3
    #print(new_foo(1, 5))   # an error "TypeError: bar() got multiple values for argument 'y'" be careful there. Now only kwargs are allowed for `y`
    

    【讨论】:

      【解决方案3】:

      也许不完全是那种形式,但是如果你用def function(arg={}) 定义一个函数,那么arg 参数的默认值将在调用之间保持不变,而不是设置为一个新对象。这意味着您可以使用:

      def function1(arg1, arg2=None, arg3=None, args={"arg2": 42, "arg3": 43}):
          if arg2 is not None:
              args["arg2"] = arg2
          if arg3 is not None:
              args["arg3"] = arg3
          arg2, arg3 = args["arg2"], args["arg3"]
          print(arg1, arg2, arg3)
      
      function1(1)  # prints 1 42 43; using default values for arg2 and arg3
      function1(1, 2) # prints 1 2 43; replace arg2 but keep arg3
      function1(1, arg3=3) # prints 1 2 3; replace arg3 but keep arg2 from previous call
      function1(0)  # prints 0 2 3; both arg2 and arg3 persist from previous calls.
      

      【讨论】:

        猜你喜欢
        • 2013-04-07
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多