代码之家  ›  专栏  ›  技术社区  ›  cap

将位置参数传递给函数

  •  1
  • cap  · 技术社区  · 8 年前

    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')
    

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

    foo('value1','value2')
    

    编辑

    我想到了另一个可能的解决办法

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Michael    8 年前

    你可以用 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 .

    希望有帮助。