繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM