将argparse.Namespace()作为字典对待的正确方法是什么?

如果我想使用argparse.ArgumentParser() (它是一个Namespace对象argparse.ArgumentParser()的结果和一个需要字典或类似映射的对象(请参阅collections.Mapping )的方法,那么正确的方法是什么?

 C:\>python Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win 32 Type "help", "copyright", "credits" or "license" for more information. >>> import argparse >>> args = argparse.Namespace() >>> args.foo = 1 >>> args.bar = [1,2,3] >>> args.baz = 'yippee' >>> args['baz'] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'Namespace' object has no attribute '__getitem__' >>> dir(args) ['__class__', '__contains__', '__delattr__', '__dict__', '__doc__', '__eq__', '_ _format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__ ', '__str__', '__subclasshook__', '__weakref__', '_get_args', '_get_kwargs', 'ba r', 'baz', 'foo'] 

“伸手”一个对象并使用__dict__属性是否合适?

我会认为答案是否定的: __getattribute__ __setattr__闻起来像一个实现惯例,但不是一个接口, __getattribute__ __setattr____setattr____contains__似乎是。

你可以用vars()来访问命名空间的字典:

 >>> import argparse >>> args = argparse.Namespace() >>> args.foo = 1 >>> args.bar = [1,2,3] >>> d = vars(args) >>> d {'foo': 1, 'bar': [1, 2, 3]} 

如果您愿意,可以直接修改字典:

 >>> d['baz'] = 'store me' >>> args.baz 'store me' 

是的,可以访问__dict__属性。 这是一个明确的,testing和保证的行为。

直接从马的嘴巴 :

如果你喜欢像字典一样的属性视图,你可以使用标准的Python成语vars()

 >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> args = parser.parse_args(['--foo', 'BAR']) >>> vars(args) {'foo': 'BAR'} 

“伸手”一个对象并使用其字典属性是否正确?

一般来说,我会说“不”。 然而, Namespace已经让我感到过度工程,可能从类不能从内置typesinheritance。

另一方面, Namespace确实提出了一种以任务为导向的方法来进行争辩,我想不出一个会要求攫取__dict__ ,但是我想象中的局限与你的想象不一样。