我想在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
做类似的事情,但我想使用点语法。是否有任何内置类只允许您分配任意属性?
答案 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'