https://docs.python.org/3/library/argparse.html#the-namespace-object
这个类故意简单,只是一个具有可读字符串表示的对象子类。如果您更喜欢类似 dict 的属性视图,可以使用 标准 Python 习语 vars():
>>>
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> args = parser.parse_args(['--foo', 'BAR'])
>>> vars(args)
{'foo': 'BAR'}
请注意,从 optparse 到 argparse 的一大进步或至少是变化之一是位置参数(例如您的参数)被视为与可选项相同。它们都出现在 args Namespace 对象中。在optparse 中,位置只是解析已定义选项的剩余部分。通过省略参数并使用parse_known_args,您可以在argparse 中获得相同的效果:
parser = argparse.ArgumentParser()
args, extras = parser.parse_known_args()
args 现在是一个命名空间,extras 是一个列表。然后您可以将您的函数称为:
myfoo(*extras, **vars(args))
例如:
In [994]: import argparse
In [995]: def foo(*args, **kwargs):
.....: print(args)
.....: print(kwargs)
.....:
In [996]: parser=argparse.ArgumentParser()
In [997]: parser.add_argument('-f','--foo')
Out[997]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [998]: args,extras = parser.parse_known_args(['-f','foobar','arg1','arg2'])
In [999]: args
Out[999]: Namespace(foo='foobar')
In [1000]: extras
Out[1000]: ['arg1', 'arg2']
In [1001]: foo(*extras, **vars(args))
('arg1', 'arg2')
{'foo': 'foobar'}
同样的argparse 段落表明您可以定义自己的Namespace 类。定义一个行为像字典(用作**args)和命名空间的行为并不难。 argparse 的所有要求是它可以与 getattr 和 setattr 一起使用。
In [1002]: getattr(args,'foo')
Out[1002]: 'foobar'
In [1004]: setattr(args,'bar','ugg')
In [1005]: args
Out[1005]: Namespace(bar='ugg', foo='foobar')
另一个标准 Python 功能让我将 vars(args) 作为元组传递:
In [1013]: foo(*vars(args).items())
(('foo', 'foobar'), ('bar', 'ugg'))
{}
对于去年 1 月的类似回答:https://stackoverflow.com/a/34932478/901925
Neatly pass positional arguments as args and optional arguments as kwargs from argpase to a function
在那里我给出了如何在解析后将“位置”与“可选”分开的想法。
这是一个自定义命名空间类,在其 API 中包含一种将自身作为字典返回的方法:
In [1014]: class MyNameSpace(argparse.Namespace):
......: def asdict(self):
......: return vars(self)
......:
In [1015]: args = parser.parse_args(['-f','foobar'], namespace=MyNameSpace())
In [1016]: args
Out[1016]: MyNameSpace(foo='foobar')
In [1017]: foo(**args.asdict())
()
{'foo': 'foobar'}
另一个想法 - 使用多个 nargs (2,'*','+') 之一作为位置参数。然后在将其传递给您的函数时,您只需键入一个名称。
parser.add_argument('pos',nargs='+')
args = ...
args.pos # a list, possibly empty
foo(*args.pos, **vars(args))