如何在Python中正确实现映射协议?

如何在Python中正确实现映射协议?,python,Python,我使用的是python spidermonkey,它在内部使用PyMapping_检查来确定用作全局(在rt.new_上下文(global))的对象是否实现了映射协议。(这基本上是一个传递给python spidermonkey的字典,因此javascript对python变量的访问受到限制。) 我在Python中找不到映射协议的正式定义,所以我一直在使用试错法来确定其中的内容。是否有官方参考?该模块定义了映射、序列等的接口 通过从该模块中的抽象基类继承,可以获得某些方法的默认实现。因此,要将其

我使用的是python spidermonkey,它在内部使用PyMapping_检查来确定用作全局(在rt.new_上下文(global))的对象是否实现了映射协议。(这基本上是一个传递给python spidermonkey的字典,因此javascript对python变量的访问受到限制。)

我在Python中找不到映射协议的正式定义,所以我一直在使用试错法来确定其中的内容。是否有官方参考?

该模块定义了
映射
序列等的接口

通过从该模块中的抽象基类继承,可以获得某些方法的默认实现。因此,要将其视为映射,您的类定义应该如下所示:

class MyMapping(collections.abc.Mapping):
    def __getitem__(self, key):
        pass
    def __iter__(self):
        pass
    def __len__(self):
        pass
class MyMutableMapping(collections.abc.MutableMapping):
    def __getitem__(self, key):
        pass
    def __setitem__(self, key, item):
        pass
    def __delitem__(self, key):
        pass
    def __iter__(self):
        pass
    def __len__(self):
        pass
继承
映射
将为您提供大多数
dict
有用方法的“免费”实现:

  • \uuuu包含
  • 项目
  • get
  • \uuuu eq\uuuu
  • \uuuu ne\uuuuu
如果这些默认方法实现在自定义数据结构中效率低下,则始终可以使用自己的版本覆盖它们


要将其视为
可变映射
,类的接口应如下所示:

class MyMapping(collections.abc.Mapping):
    def __getitem__(self, key):
        pass
    def __iter__(self):
        pass
    def __len__(self):
        pass
class MyMutableMapping(collections.abc.MutableMapping):
    def __getitem__(self, key):
        pass
    def __setitem__(self, key, item):
        pass
    def __delitem__(self, key):
        pass
    def __iter__(self):
        pass
    def __len__(self):
        pass
MutableMapping
继承可获得所有
Mapping
方法的“免费”定义,另外:

  • pop
  • popitem
  • 清除
  • 更新
  • setdefault


如果您是从头开始“滚动您自己的”,并且不想使用抽象基类,那么您可能应该尝试定义上述所有方法,如果您希望您的类可以被严格的Liskov替换为
dict

,这似乎是正确的,谢谢!我希望他们在该页面的任何地方都使用了关键字映射协议。如果您知道您已经实现了足够多的映射协议用于特定用途,但还不足以通过常规映射检查,那么您也可以使用
collections.mapping.register(MyMappingLikeClass)
。@Blckknght:“常规映射检查”是什么?我认为
\uuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。