我想在Python命名空间下存储一堆变量而不创建单独的模块.我注意到ArgumentParsers 的结果parse_args()是一个argparse.Namespace对象.您可以通过点语法访问参数.
from argparse import ArgumentParser
parser = ArgumentParser()
# some arg definitions here...
args = parser.parse_args() # returns a `argparse.Namespace` object
Run Code Online (Sandbox Code Playgroud)
我怎样才能创建一个相当于argparse.Namespace?我知道我可以用a做类似的事情,dict但我想用点语法.是否有任何内置类只允许您分配任意属性?
从python3.3开始,您可以使用types.SimpleNamespace.
然而另一种选择是:
class Namespace(object):
pass
namespaceA = Namespace()
namespaceA.x = 1
Run Code Online (Sandbox Code Playgroud)
完整的代码SimpleNamespace不会太久.
请注意,您不能简单地使用object实例:
>>> o = object()
>>> o.x = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
这是因为object没有__dict__属性的实例:
>>> vars(object())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute
Run Code Online (Sandbox Code Playgroud)
这意味着您无法设置实例的属性object.
任何object没有__slots__属性集的子类都具有__dict__(默认情况下)用于存储/检索属性的子类:
>>> class Namespace(object):
... pass
...
>>> a = Namespace()
>>> a.x = 1 # same as as.__dict__['a'] = 1
>>> a.__dict__
{'x': 1}
Run Code Online (Sandbox Code Playgroud)
有关属性设置/查找的更多信息,您应该了解描述符.