Python-覆盖函数参数

时间:2019-01-04 13:59:31

标签: python python-3.x

编写一个cli函数,该函数应执行以下操作:

如果未设置功能参数(我从docopt获取), 我想从环境中查找它们。 由于功能的快速加载,以下内容不起作用:

def my_function(a=None, b=None, c=None):
    for v in ("a", "b", "c"):
        if vars()[v] is None:
            locals()[v] = getenv("env_{}".format(v).upper())
    do_something_with(a, b, c)

实现此目标的Python方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用关键字参数轻松做到这一点:

def my_function(**kwargs):
    for var in ('a', 'b', 'c'):
        if kwargs.get(var) is None:
            kwargs[var] = getenv("env_{}".format(v).upper())
    do_something_with(**kwargs)

如果要保留签名,则可以创建装饰器(functools.wraps负责对齐签名):

def defaults_from_env(function):
    @functools.wraps(function)
    def wrapper(**kwargs):
        for var in kwargs:
            if kwargs.get(var) is None:
                kwargs[var] = getenv("env_{}".format(var).upper())
        return function(**kwargs)
    return wrapper


@defaults_from_env
def my_function(a=None, b=None, c=None):
    print(a, b, c)

但是,这会强制您在调用修饰后的my_function(即a=.., b=.., c=..)时命名所有参数。为了避免这种情况,您可以使用inspect.signature来绑定包装器中的参数。这样您就可以获取所有*arg**kwarg参数的名称和值。