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

时间:2014-09-17 17:00:30

标签: python

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

argparse.Namespace

如何创建等效的from argparse import ArgumentParser parser = ArgumentParser() # some arg definitions here... args = parser.parse_args() # returns a `argparse.Namespace` object ?我知道我可以用argparse.Namespace做类似的事情,但我想使用点语法。是否有任何内置类只允许您分配任意属性?

5 个答案:

答案 0 :(得分:7)

从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实例的属性。

没有__slots__属性集的任何object子类都有__dict__(默认情况下)用于存储/检索属性:

>>> class Namespace(object):
...     pass
... 
>>> a = Namespace()
>>> a.x = 1     # same as as.__dict__['a'] = 1
>>> a.__dict__
{'x': 1}

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

答案 1 :(得分:1)

一个类可以用作命名空间,其中变量是类成员:

class Namespace1:
    foo = 'a'
    bar = 5

为防止调用者尝试实例化,您可以使用类似的基类:

class objectless(object):
    def __new__(cls, *args, **kwargs):
        raise RuntimeError('%s should not be instantiated' % cls)

并使用它:

class Namespace1(objectless):
    ...

答案 2 :(得分:1)

听起来你想要一个python class。请参阅the docs

根据您的需要,您可以将一组变量定义为类的属性(实例的变量或类本身的变量),并以这种方式访问​​它们。

答案 3 :(得分:1)

如果您想要&#34;相当于argparse.Namespace&#34;,请使用argparse.Namespace

from argparse import Namespace

ns = Namespace(a=1)
print ns.a

答案 4 :(得分:0)

如果我理解正确,您希望动态添加属性。例如,一个类解析命令行标志,你可以像args.verbose一样直接访问它们,对吧?如果是这样,您可能会考虑使用setattr()来添加任意属性。

class Foo(object):
    pass

foo = Foo()
setattr(foo, 'ack', 'bar')
print(foo.ack) # prints 'bar'