Python为后续函数调用设置参数值

时间:2019-04-02 09:13:46

标签: python

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])

此后,当我调用具有默认参数func_1()param_1=0的{​​{1}}时,实际上它会得到param_2=Noneparam_1=value_1而无需设置调用param_2=value_2时手动设置。

3 个答案:

答案 0 :(得分: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返回的新函数,并且未按原位设置 的默认参数。

答案 1 :(得分:1)

如果您希望将来能够设置参数,则可以使用某种装饰器来完成。

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`

答案 2 :(得分:0)

也许不是那种形式,但是如果使用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.