有条件地将参数传递给python中的方法

时间:2015-06-29 18:09:24

标签: 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中设置默认值,但我想使用方法定义中设置的默认值。

2 个答案:

答案 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)

这个解决方案经过严格测试,可能需要工作才能使其更加强大,但这个想法是存在的,并且应该在简单的情况下工作。