[英]Conditional passing of arguments to methods in python
我想从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中设置默认值,但是我想使用方法定义中设置的默认值。
使用具有kwargs解包语法的字典。
args = parser.parse_args()
result = my_func(**vars(args))
编辑
使用ArgumentParser的SUPPRESS
参数删除空值:
parser = argparse.ArgumentParser(description='Get the numeric values.',
argument_default=argparse.SUPPRESS)
我遇到的第一个解决方案似乎有点棘手...但是在这里。
使用inspect
编写一个函数,该函数查看函数的参数,并仅将其从args
接受且不是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)
该解决方案的测试还不够充分,可能需要做一些工作才能使其更强大,但是这种想法已经存在,并且应该可以在简单的情况下使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.