我正在使用 python-spidermonkey,它在内部使用 PyMapping_Check 来识别被用作全局的对象(在 rt.new_context(global) 中)是否实现了映射协议。(这基本上是一个传递给 python-spidermonkey 的字典,因此 javascript 对 python 变量的访问受到限制。)
我找不到 Python 中映射协议的官方定义,所以我一直在使用反复试验来确定其中的内容。有官方参考吗?
我正在使用 python-spidermonkey,它在内部使用 PyMapping_Check 来识别被用作全局的对象(在 rt.new_context(global) 中)是否实现了映射协议。(这基本上是一个传递给 python-spidermonkey 的字典,因此 javascript 对 python 变量的访问受到限制。)
我找不到 Python 中映射协议的官方定义,所以我一直在使用反复试验来确定其中的内容。有官方参考吗?
该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
.