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

时间:2013-11-04 19:40:15

标签: python

我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别被用作全局的对象(在rt.new_context(全局)中)是否实现了映射协议。 (这基本上是传递给python-spidermonkey的字典,因此javascript对python变量的访问权限有限。)

我没有找到Python中的映射协议的官方定义,所以我一直在使用反复试验来确定其中的内容。有官方参考吗?

1 个答案:

答案 0 :(得分:14)

collections.abc模块为MappingSequence等内容定义接口。

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

class MyMapping(collections.abc.Mapping):
    def __getitem__(self, item)
    def __iter__(self)
    def __len__(self)

继承Mapping会让您“免费”实施大多数dict的有用方法:

  • __contains__
  • keys
  • items
  • values
  • get
  • __eq__
  • __ne__

如果这些默认方法实现对您的自定义数据结构效率低下,您始终可以使用自己的版本覆盖它们。


要被视为MutableMapping,您班级的界面应如下所示:

class MyMutableMapping(collections.abc.MutableMapping):
    def __getitem__(self, item)
    def __setitem__(self, item)
    def __delitem__(self, item)
    def __iter__(self)
    def __len__(self)

MutableMapping继承可以获得所有Mapping方法的'免费'定义,以及:

  • pop
  • popitem
  • clear
  • update
  • setdefault

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