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

我想在 Python 命名空间下存储一堆变量而不创建单独的模块。我注意到 ArgumentParserparse_args() 的结果是一个 argparse.Namespace 对象。您可以通过点语法访问参数。

from argparse import ArgumentParser

parser = ArgumentParser()
# some arg definitions here...
args = parser.parse_args()  # returns a `argparse.Namespace` object

如何创建 argparse.Namespace 的等价物?我知道我可以用 dict 做类似的事情,但我想使用点语法。是否有任何内置类可以让您分配任意属性?

最佳答案

从 python3.3 开始,您可以使用 types.SimpleNamespace

然而,另一种选择很简单:

class Namespace(object):
    pass

namespaceA = Namespace()
namespaceA.x = 1
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'

这是因为 object 的实例没有 __dict__ 属性:
>>> vars(object())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute

这意味着您不能设置 object 实例的属性。

任何没有 object 属性集的 __slots__ 子类都有 __dict__ 用于(默认情况下)存储/检索属性:
>>> class Namespace(object):
...     pass
... 
>>> a = Namespace()
>>> a.x = 1     # same as as.__dict__['a'] = 1
>>> a.__dict__
{'x': 1}

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