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

2024-03-19

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

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


The collections.abc http://docs.python.org/3.3/library/collections.abc.html#collections-abstract-base-classes模块定义了类似的接口Mapping, Sequence, 等等。

通过从该模块中的抽象基类继承,您可以获得某些方法的默认实现。所以要被认为是Mapping,你的类定义应该是这样的:

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

继承自Mapping将为您提供大部分的“免费”实现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

继承自MutableMapping为您提供所有的“自由”定义Mapping的方法,加上:

  • pop
  • popitem
  • clear
  • update
  • setdefault

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中正确实现映射协议? 的相关文章

随机推荐

  • Java 中有类似 PHP 的三元运算符的简短版本吗?

    在 PHP 中 三元运算符有一个简短的版本 expr1 expr2 expr3 变成 expr1 expr3 简短版本返回 true 时 expr1 的结果和 false 时 expr3 的结果 这允许很酷的代码可以根据自己的当前状态填充变
  • 用两个 CGPoints SpriteKit Swift 创建一条线

    我正在尝试制作一个简单的应用程序 您触摸一个点 无论您触摸哪里 精灵都会沿着一条线穿过该点到达屏幕边缘 我想绘制连接精灵原点 它的起点 和您触摸的点的线段 以及精灵原点和屏幕边缘终点之间的线段 这样我就可以可视化路径精灵以及原点 触摸点和终
  • 如何防止 Visual Studio 2012 扩展 MSBuild 4 通配符?

    我最近将我们的构建平台从基于 rake 的古老构建 别问 认真的 迁移到使用 msbuild 的构建平台 因为我们的许多团队成员不使用 Visual Studio 再次强调 不要问 他们习惯于将 cs 文件放入项目文件夹中 然后让它神奇地作
  • 带参数导航返回的 React Router 需要双击

    简单的问题 当我处于例如 dashboard路由器 我点击路由器并尝试返回 dashboard它对葡萄酒有效 但是从什么时候开始 users userID我导航到另一个路由器 users userID路由器并尝试返回我需要单击后退按钮两次
  • R:在数据框或矩阵中使用 t.test 函数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 询问代码的问题必须对所解决的问题表现出最低限度的了解 包括尝试的解决方案 为什么它们不起作用以及预期结果 也可以看看 Stack Over
  • c# httpwebrequest getResponse() 冻结并挂起我的程序

    我试图使用 httpwebrequest 在远程服务器上使用类似于休息的服务 从第一次执行本身开始 我的代码就挂起了程序 然后我尝试将它作为控制台应用程序 以确保它与程序本身无关 但没有运气 string credentialsJson u
  • TreeView — 选定的节点样式不会出现在选定的节点上

    我的代码是
  • Java 项目的 SLOC

    我需要一个免费工具来计算 Java 项目的 SLOC 我只需要以下指标 SLOC 注释行数 可选地javadoc 指标 可选地按文件类型 java js css html xml 等 对统计信息进行排序 Bonus 100 Java 我不喜
  • Python Base 36 编码

    如何在 Python 中以 36 为基数对整数进行编码 然后再次解码 您尝试过维基百科的示例代码吗 def base36encode number alphabet 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • Django TypeError:没有主键值的模型实例是不可散列的

    我有我的models py如下 class Article models Model date models DateTimeField null True blank True title models TextField default
  • 如何根据用户摘要生成随机 5 位数字

    大家好 我尝试根据用户总摘要生成 50 个 5 位数字 例如 用户给出 500000 然后我需要随机数 5 位乘 50 个数字等于 500000 我尝试了这个 但它不是 5 位数字 int balane 500000 int nums 50
  • 双向git镜像

    我有兴趣将本地 git 存储库设置为远程存储库的镜像 我读过一些可能相关的帖子 但主要区别是我需要对两个存储库具有读写访问权限 大多数时候 用户将针对 Repo A 进行工作 但有时他们会针对 Repo B 进行工作 并且这些需要通过服务器
  • 统计某个时间段之前和之后存在的值

    我有以下简单的表格 您也可以在SQL Fiddle here http www sqlfiddle com 9 74d8fb 3 CREATE TABLE Orders Customer TEXT Order Date DATE INSER
  • 带有 CSS 的 GWT Html 文件

    当我使用 GWT 插件创建新项目时 它会为我创建一个框架项目 在html文件中有一条注释说 考虑内联 CSS 以减少请求的文件数量 为什么我要考虑使用内联CSS 我很难将 css 放在单独的文件中而不是内联 会减少文件的大小吗 不是吗 答案
  • 检查 Wicket 中的用户代理

    我使用的是 wicket 1 5 但我无法在getClientInfo 方法 WebRequest RequestCycle get getRequest 我在其他地方看到了这段代码 WebClientInfo clientInfo Web
  • YARN 作业历史记录不可访问

    我正在使用来自源代码的最新 hadoop 版本 3 0 0 我已经启动并运行了时间轴服务 并配置了 hadoop 以将其用于作业历史记录 但是 当我单击资源管理器 UI 中的历史记录时 出现以下错误 HTTP ERROR 404 Probl
  • 如果在从开始到结束迭代时对地图元素调用擦除()会发生什么?

    在下面的代码中 我循环遍历地图并测试是否需要删除元素 擦除元素并继续迭代是否安全 或者我是否需要在另一个容器中收集密钥并执行第二个循环来调用擦除 map
  • 无法调整大小的 JFrame 包错误

    JFrame s pack 当窗口无法调整大小时 该方法不会每次都起作用 请亲自尝试一下 可能需要重试几次 import javax swing import java awt public class FramePackBug publi
  • Eclipse javadoc 注释中的错误换行

    我认为 Eclipse 内置的 Java 格式化程序中有一个小但烦人的错误 我有一个 Javadoc 注释 如下所示 stuff code mTasksBelow 其中末尾的句点位于第 81 列中 格式化程序设置为在第 80 行包装 Jav
  • 如何在Python中正确实现映射协议?

    我正在使用 python spidermonkey 它在内部使用 PyMapping Check 来识别用作全局对象 在 rt new context global 中 是否实现了映射协议 这基本上是传递给 python spidermon