将位置参数传递给函数

时间:2018-08-16 13:28:39

标签: python python-2.7 argparse

我正在编写一个模块,该模块可以直接从导入以及使用argparse从命令行访问。 如何允许我的函数同时适用于argparse和常规模块导入? Argparse要求我使用以下内容:

import argparse 

def foo(args):
  arg1 = args.arg1
  arg2 = args.arg2

if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  subparsers = parser.add_subparsers()

  parser_foo = subparsers.add_parser('foo')
  parser_foo.add_argument('arg1')
  parser_foo.add_argument('arg2')
  parser_foo.set_defaults(func=foo)
  args = parser.parse_args()
  args.func(args)

但是,如果导入此模块,则不能仅输入所有内容的一个参数“ args”。

我考虑过只使用**kwargs来接收参数(将argparse参数传递为vars(**args)),但是我不确定这是否是一种好习惯。

def foo(**kwargs):
  arguments = {
    arg1 = None,
    arg2 = None,
  }
  arguments.update(**kwargs)

  arg1 = arguments['arg1']
  arg2 = arguments['arg2']

然后,每次使用导入模块中的函数时,都必须使用关键字参数。

foo(arg1='value1',arg2='value2')

有什么更好的方法来解决这个问题?

是否可以使用argparse传递位置参数?因此,当导入模块时,就可以做到

foo('value1','value2')

编辑

我想到了另一个可能的解决方案

def foo(arg1=None,arg2=None):
  pass

这样,该函数将同时接受kwarg和args。好的/不好的做法?

1 个答案:

答案 0 :(得分:1)

您可以使用vars()从命名空间中获取字典。这是一个简单的示例:

import argparse


def introduce(name, age):
    print '{} is {} years old'.format(name, age)


def handle_parameters():
    parser = argparse.ArgumentParser()
    parser.add_argument('name', type=str)
    parser.add_argument('age', type=int)
    return parser.parse_args()


def main():
    args = handle_parameters()

    introduce(**vars(args))
    introduce('john', 10)


if __name__ == '__main__':
    main()

如果您有很多参数,或者您不喜欢此解决方案,则可以创建自己的命名空间,并仅将一个参数(命名空间)传递给函数,如this post中所述。

希望有帮助。