编写一个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方法是什么?
答案 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
参数的名称和值。