我有很多可能来自argparse的参数,我想传递给一个函数。如果没有设置变量,我希望该方法使用其默认变量。但是,处理哪些论点已经设定并且哪些不再繁琐:
import argparse
def my_func(a = 1, b = 2):
return a+b
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Get the numeric values.')
parser.add_argument('-a', type=int)
parser.add_argument('-b', type=int)
args = parser.parse_args()
if not args.a is None and not args.b is None:
result = my_func(a = args.a, b = args.b)
elif not args.a is None and args.b is None:
result = my_func(a = args.a)
elif not args.b is None and args.a is None:
result = my_func(b = args.b)
else:
result = my_func()
似乎我应该能够做到这样的事情:
result = my_func(a = args.a if not args.a is None, b = args.b if not args.b is None)
但这会在逗号上出现语法错误。
我可以在argparser中设置默认值,但我想使用方法定义中设置的默认值。
答案 0 :(得分:4)
使用带有kwargs解包语法的字典。
args = parser.parse_args()
result = my_func(**vars(args))
修改强>
使用ArgumentParser的SUPPRESS
参数删除空值:
parser = argparse.ArgumentParser(description='Get the numeric values.',
argument_default=argparse.SUPPRESS)
答案 1 :(得分:1)
来到我身边的第一个解决方案看起来很糟糕......但现在就是。
使用inspect
编写一个查看函数参数的函数,并仅传递它接受args
的{{1}}参数,而不是None
。我的猜测是,这将被广泛认为是不好的做法......
import inspect
def call_function(fn, args):
argspec = inspect.getargspec(fn)
arglist = {}
for arg in argspec.args:
if arg in args.__dict__.keys() and args.__dict__[arg] is not None:
arglist[arg] = args.__dict__[arg]
return fn(**arglist)
这是在行动:
import argparse
def my_func(a=1, c=2):
return a,c
a=None
b=2
c=3
args=argparse.Namespace(a=a,b=b,c=c)
call_function(my_func, args)
>> (1, 3)
这个解决方案经过严格测试,可能需要工作才能使其更加强大,但这个想法是存在的,并且应该在简单的情况下工作。