如果我想将的结果(argparse.ArgumentParser()即Namespace对象)与需要字典或类映射对象的方法一起使用(请参见collections.Mapping),那么正确的方法是什么?
argparse.ArgumentParser()
Namespace
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__属性是否合适?
__dict__
我认为答案是否定的:__dict__闻起来像执行公约,而不是一个接口,方式__getattribute__或__setattr__或__contains__似乎是。
__getattribute__
__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__属性。这是定义明确,经过测试且有保证的行为。