使用 nargs 参数时,如何使 argparse.ArgumentParser return 成为元组或 np.array 而不是列表?
How to make argparse.ArgumentParser return a tuple or an np.array rather than a list when using the nargs parameter?
我想解析一个带有多个参数的选项,return一个值作为我选择的集合,例如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
本身将参数存储在列表以外的集合中?
可以通过创建自定义操作来实现。例如,
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))
我想解析一个带有多个参数的选项,return一个值作为我选择的集合,例如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
本身将参数存储在列表以外的集合中?
可以通过创建自定义操作来实现。例如,
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))