首页 文章

将位置参数传递给函数

提问于
浏览
1

我正在编写一个模块,可以直接从导入访问,也可以使用 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')

EDIT

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

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

这样函数就可以接受kwargs和args . 好/坏的做法?

1 回答

  • 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中所述 .

    希望能帮助到你 .

相关问题