The following seems to work either way. What is the advantage [other than the nice repr
] of using types.SimpleNamespace
? Or is it the same thing?
>>> import types
>>> class Cls[]:
... pass
...
>>> foo = types.SimpleNamespace[] # or foo = Cls[]
>>> foo.bar = 42
>>> foo.bar
42
>>> del foo.bar
>>> foo.bar
AttributeError: 'types.SimpleNamespace' object has no attribute 'bar'
asked May 11, 2016 at 11:28
BaruchBaruch
19.6k23 gold badges123 silver badges195 bronze badges
0
This is explained pretty well in the types module description. It shows you that types.SimpleNamespace
is roughly equivalent to
this:
class SimpleNamespace:
def __init__[self, **kwargs]:
self.__dict__.update[kwargs]
def __repr__[self]:
keys = sorted[self.__dict__]
items = ["{}={!r}".format[k, self.__dict__[k]] for k in keys]
return "{}[{}]".format[type[self].__name__, ", ".join[items]]
def __eq__[self, other]:
return self.__dict__ == other.__dict__
This provides the following advantages over an empty class:
- It allows you to initialize attributes while constructing the object:
sn = SimpleNamespace[a=1, b=2]
- It provides a readable
repr[]
:eval[repr[sn]] == sn
- It overrides the default comparison. Instead of comparing by
id[]
, it compares attribute values instead.
martineau
115k25 gold badges160 silver badges282 bronze badges
answered May 11, 2016 at 11:33
9
A class types.SimpleNamespace
provides a mechanism to instantiate an object that can hold attributes and nothing else. It is, in effect, an empty class with a fancier __init__[]
and a helpful __repr__[]
:
>>> from types import SimpleNamespace
>>> sn = SimpleNamespace[x = 1, y = 2]
>>> sn
namespace[x=1, y=2]
>>> sn.z = 'foo'
>>> del[sn.x]
>>> sn
namespace[y=2, z='foo']
or
from types import SimpleNamespace
sn = SimpleNamespace[x = 1, y = 2]
print[sn]
sn.z = 'foo'
del[sn.x]
print[sn]
output:
namespace[x=1, y=2]
namespace[y=2, z='foo']
This answer may also be helpful.
answered Feb 5, 2021 at 14:12
Not the answer you're looking for? Browse other questions tagged python python-3.x or ask your own question.
Bạn có thể tạo một lớp đơn giản:
class Namespace:
def __init__[self, **kwargs]:
self.__dict__.update[kwargs]
và nó sẽ hoạt động theo cách giống hệt như argparse
Namespace
lớp khi nói đến các thuộc tính:
>>> args = Namespace[a=1, b='c']
>>> args.a
1
>>> args.b
'c'
Ngoài ra, chỉ cần nhập lớp ; nó có sẵn từ argparse
mô-đun:
from argparse import Namespace
args = Namespace[a=1, b='c']
Đối với Python 3.3, cũng có types.SimpleNamespace
, về cơ bản cũng làm điều tương tự:
>>> from types import SimpleNamespace
>>> args = SimpleNamespace[a=1, b='c']
>>> args.a
1
>>> args.b
'c'
Hai loại là khác biệt; SimpleNamespace
được sử dụng chủ yếu cho
sys.implementation
thuộc tính và giá trị trả về của time.get_clock_info[]
.
So sánh thêm:
- Cả hai lớp đều hỗ trợ kiểm tra bình đẳng; đối với hai trường hợp của cùng một lớp,
instance_a == instance_b
là true nếu chúng có cùng thuộc tính với cùng giá trị. - Cả hai lớp đều hữu ích
__repr__
để hiển thị những thuộc tính mà chúng có. Namespace[]
đối tượng hỗ trợ kiểm tra ngăn chặn;'attrname' in instance
là true nếu cá thể không gian tên có tên thuộc tínhattrname
.SimpleNamespace
không làm.Namespace[]
các đối tượng có một._get_kwargs[]
phương thức không có tài liệu trả về một danh sách các[name, value]
thuộc tính đã được sắp xếp cho trường hợp đó. Bạn có thể nhận được như nhau cho một trong hai lớp bằng cách sử dụngsorted[vars[instance].items[]]
.- Mặc dù
SimpleNamespace[]
được triển khai bằng C vàNamespace[]
được triển khai bằng Python, nhưng việc truy cập thuộc tính không nhanh hơn vì cả hai đều sử dụng cùng một__dict__
bộ lưu trữ cho các thuộc tính. Kiểm tra tính bình đẳng và tạo ra biểu diễn nhanh hơn một chút đối với cácSimpleNamespace[]
trường hợp.
142 hữu ích 2 bình luận chia sẻ