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

Chr*_*ris 11 python

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

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

Ben*_*son 17

collections.abc模块定义了诸如Mapping,Sequence等等的接口.

通过继承该模块中的抽象基类,您可以获得某些方法的默认实现.所以要考虑到Mapping,你的类定义应该如下所示:

class MyMapping(collections.abc.Mapping):
    def __getitem__(self, item)
    def __iter__(self)
    def __len__(self)
Run Code Online (Sandbox Code Playgroud)

继承Mapping将获得大多数dict有用方法的"免费"实现:

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

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


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

class MyMutableMapping(collections.abc.MutableMapping):
    def __getitem__(self, item)
    def __setitem__(self, item)
    def __delitem__(self, item)
    def __iter__(self)
    def __len__(self)
Run Code Online (Sandbox Code Playgroud)

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

  • pop
  • popitem
  • clear
  • update
  • setdefault

如果你从头开始"自己滚动"并且不想使用抽象基类,那么你应该尝试定义 所有上述方法,如果你希望你的类严格地是Liskov可替代的dict.