18

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

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

4

1 回答 1

27

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

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

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

继承 fromMapping将为您提供大多数dict有用方法的“免费”实现:

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

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


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

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

继承 fromMutableMapping可以让您“自由”定义所有Mapping's 方法,此外:

  • pop
  • popitem
  • clear
  • update
  • setdefault

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

于 2013-11-04T19:45:10.560 回答