如何在Python脚本中创建单独的命名空间?

Sea*_*sey 3 python

我想在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但我想用点语法.是否有任何内置类只允许您分配任意属性?

Bak*_*riu 8

从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)

有关属性设置/查找的更多信息,您应该了解描述符.