python:重载**dict解包

2024-05-23 16:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够从dict类似类中解包一个对象

当前: f(**m.to_dict())

首选 f(**m)

如果starstarprepare存在,这将起作用:

class M:
    #... __getitem__, __setitem__
    def __starstarprepare__(self):
        md = self.to_dict()
        return md

Tags: to对象selfreturndefmddictclass
3条回答

**可用于任何映射类型。使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方法的包装器

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

相关问题 更多 >