代码之家  ›  专栏  ›  技术社区  ›  P-Gn

如何进行argparse。ArgumentParser返回元组或np。使用nargs参数时,是否使用数组而不是列表?

  •  2
  • P-Gn  · 技术社区  · 8 年前

    我想解析具有多个参数的选项,并返回一个值作为我选择的集合,例如 tuple 或者 np.array 而不是 list .

    我可以按照中的建议,在解析后简单地转换结果列表 this answer ,

    parser.add_argument('--foo', nargs='*')
    options = parser.parse_args('--foo 1 2 3'.split())
    # manual casts go here
    options.foo = tuple(options.foo)
    

    但这可能会很麻烦,而且容易出错,尤其是如果我们有很多这样的参数需要转换的话。

    有可能吗 ArgParser 自身是否将参数存储在列表以外的集合中?

    1 回复  |  直到 6 年前
        1
  •  4
  •   P-Gn    8 年前

    可以通过创建自定义操作来实现。例如

    import argparse
    import numpy as np
    
    def collect_as(coll_type):
      class Collect_as(argparse.Action):
        def __call__(self, parser, namespace, values, options_string=None):
          setattr(namespace, self.dest, coll_type(values))
      return Collect_as
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--foo', nargs='*', type=int, action=collect_as(tuple))
    parser.add_argument('--bar', nargs='*', type=np.float32, action=collect_as(np.array))
    options = parser.parse_args('--foo 1 2 3 --bar 4 5 6'.split())
    print(options)
    # Namespace(bar=array([4., 5., 6.], dtype=float32), foo=(1, 2, 3))