我正在使用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__keysitemsvaluesget__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方法的"免费"定义,以及:
poppopitemclearupdatesetdefault如果你从头开始"自己滚动"并且不想使用抽象基类,那么你应该尝试定义 所有上述方法,如果你希望你的类严格地是Liskov可替代的dict.
| 归档时间: |
|
| 查看次数: |
3327 次 |
| 最近记录: |