2024-05-23 16:23:15 发布
网友
我希望能够从dict类似类中解包一个对象
当前: f(**m.to_dict())
f(**m.to_dict())
首选 f(**m)
f(**m)
如果starstarprepare存在,这将起作用:
starstarprepare
class M: #... __getitem__, __setitem__ def __starstarprepare__(self): md = self.to_dict() return md
**可用于任何映射类型。使M成为映射类型的一种方法是将collections.abc.Mapping子类化并实现__getitem__、__iter__和__len__:
**
M
collections.abc.Mapping
__getitem__
__iter__
__len__
from collections.abc import Mapping class M(Mapping): def __init__(self): self.a = 3 self.b = 5 def __getitem__(self, key): return getattr(self, key) def __iter__(self): yield 'a' yield 'b' def __len__(self): return 2 def foo(**kwargs): for k, v in kwargs.items(): print(k, v) m = M() foo(**m)
如果您已经有了一个to_dict方法,那么所有三个神奇的方法都可以是相应的dict方法的包装器
to_dict
dict
class M(Mapping): def __init__(self): self.a = 3 self.b = 5 def to_dict(self): return {'a': self.a, 'b': self.b} def __getitem__(self, key): return self.to_dict()[key] def __iter__(self): return iter(self.to_dict()) def __len__(self): return len(self.to_dict())
您可以使用collections.abc.Mapping
from collections.abc import Mapping class M(Mapping): def __iter__(self): return iter(self.to_dict()) def __getitem__(self, item): return self.to_dict()[item] def __len__(self): return len(self.to_dict())
由于@peter而产生的解决方案
class M: # ... __getitem__ and other functions def keys(self): k = self.to_dict().keys() return k
**
可用于任何映射类型。使M
成为映射类型的一种方法是将collections.abc.Mapping
子类化并实现__getitem__
、__iter__
和__len__
:如果您已经有了一个
to_dict
方法,那么所有三个神奇的方法都可以是相应的dict
方法的包装器您可以使用
collections.abc.Mapping
由于@peter而产生的解决方案
相关问题 更多 >
编程相关推荐