Python中向方法传递参数的条件传递

6

我有许多可能的参数需要从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
如果没有相应的else,则表达式中只能使用iff(a if b) - 不好。 f(a if b else c) - 好。 - Kevin
2个回答

4

使用kwargs展开语法与字典一起使用。

args = parser.parse_args()
result = my_func(**vars(args))

编辑

使用SUPPRESS参数来移除空值,该参数可应用于ArgumentParser

parser = argparse.ArgumentParser(description='Get the numeric values.',
                                 argument_default=argparse.SUPPRESS)

这不是我想要的,它将a和b作为None和None发送到my_func。 - Catherine Holloway
这回答了我的原始问题,但它假设my_func将使用与argparser相同的所有变量。如果有其他参数在argparser中,则需要在传递给my_func之前将它们删除。 - Catherine Holloway

1

我想到的第一个解决方案似乎有点取巧...但是在这里。

使用 inspect 编写一个函数,查看函数的参数,并仅将接受并且不是 None 的参数从 args 传递给它。我的猜测是,这将被广泛认为是不良实践...

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)

这个解决方案测试不充分,可能需要改进以使其更加健壮,但是思路已经在那里,并且在简单情况下应该可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接