The Namespace
你从parse_args
将具有与您的每个参数相对应的属性。位置参数和可选参数之间没有区别,例如:
args
Namespace(a='1',b='one',x='foo', y=...)
正如有详细记录的那样,可以通过以下方式访问:
args.a
args.x
etc.
The Namespace
也可以变成字典:
vars(args)
{'a'='1', 'b'='one', etc.}
您可以将字典传递给函数,如下所示**kwargs
。这是标准的 Python 论证实践。
如果你想传递一些参数*args
你必须把它们分开Namespace
或者自己查字典。里面什么都没有argparse
会为你做的。
您可以编写一个类似的函数(未测试):
def split_args(args):
vargs = vars(args)
alist = ['a','b','c']
args1 = []
for a in alist:
v = vargs.pop(a)
args1.append(v)
return args1, vars
或者更紧凑地,将pop
在列表理解中:
In [702]: vargs = dict(a=1,b=3,c=4,x=5,y=3,z=3)
In [703]: [vargs.pop(a) for a in ['a','b','c']]
Out[703]: [1, 3, 4]
In [704]: vargs
Out[704]: {'y': 3, 'x': 5, 'z': 3}
In [705]: def foo(*args,**kwargs):
.....: print(args)
.....: print(kwargs)
.....:
In [706]: vargs = dict(a=1,b=3,c=4,x=5,y=3,z=3)
In [707]: foo(*[vargs.pop(a) for a in ['a','b','c']],**vargs)
(1, 3, 4)
{'x': 5, 'z': 3, 'y': 3}
使用自定义 Action 类的进一步想法
The parser
确定一个参数是否是一个optional
vs. positional
by its option_strings
属性。add_argument
返回一个Action
子类,它将具有以下属性:
MyAction(option_strings=[], dest='baz', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
这是一个positional
因为option_strings
是一个空列表。
MyAction(option_strings=['-m', '--mew'], dest='mew', nargs=None,...)
is an optional
因为该列表不为空。
解析器将输入字符串与option_strings
and nargs
,然后将值传递给__call__
匹配方法Action
。该方法定义如下:
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)
这是默认值store
行动。这些值被放入Namespace
as the dest
属性。
The option_string
参数是触发此调用的字符串,例如“-m”或“--mew”,或者None
for a positional
。定义的操作类型不使用此功能,但用户定义的操作类可以执行某些操作。
class MyAction(argparse._StoreAction):
def __call__(self, parser, namespace, values, option_string=None):
# store option_string along with values in the Namespace
setattr(namespace, self.dest, [values,option_string])
或者你可以做一些特别的事情positionals
, e.g.
if option_string is None:
# append values to a `star_args` attribute
# rather than self.dest
通过这样的动作positionals
解析后可以访问为:
args.star_args
解析器确实维护这样的列表属性。这extras
that parse_known_args
返回值暂时存储在Namespace
在“_UNRECOGNIZED_ARGS_ATTR”属性中。