PyTuple_SetItem 的限制

2023-12-24

我有一个 Python 扩展模块,它创建一个元组作为另一个对象的属性,并在元组中设置项目。每当我在Python中执行这个模块时,我总是收到错误SystemError: bad argument to internal function

阅读完文档后PyTuple,并调试了我的程序几个小时,我仍然无法弄清楚到底发生了什么。通过调试器运行我的程序表明问题发生在 Python 解释器内的库调用中。于是,最后我查看了Python源码,终于意识到了问题所在。这PyTuple_SetItem函数有一个我不知道的有趣限制,也找不到明确的记录。

以下是 Python 源代码中的重要函数(为了清晰起见进行了编辑):

int PyTuple_SetItem(register PyObject *op, register Py_ssize_t i, PyObject *newitem)
{
    .....
    if (!PyTuple_Check(op) || op->ob_refcnt != 1) {
        Py_XDECREF(newitem);
        PyErr_BadInternalCall();
        return -1;
    }
    .....
}

这里重要的一行是条件op->ob_refcnt != 1。所以问题是:你甚至不能打电话PyTuple_SetItem除非元组的引用计数为 1。看起来这里的想法是你永远不应该使用PyTuple_SetItem除非您使用以下命令创建元组之后PyTuple_New()。我想这是有道理的,因为毕竟元组应该是不可变的,所以这个限制有助于让你的 C 代码更符合 Python 类型系统的抽象。

但是,我在任何地方都找不到此限制的记录。相关文档似乎是here http://docs.python.org/c-api/intro.html#reference-count-details and here http://docs.python.org/py3k/c-api/tuple.html?highlight=pytuple_getitem#PyTuple_SetItem,两者都没有指定此限制。文档基本上说,当你打电话时PyTuple_New(X),元组中的所有项目都被初始化为NULL。自从NULL不是有效的 Python 值,扩展模块程序员需要确保在将元组返回到解释器之前,元组中的所有槽都已填充正确的 Python 值。但它并没有在任何地方说明当 Tuple 对象的引用计数为 1 时必须执行此操作。

所以现在的问题是,我基本上已经把自己编码到了一个角落,因为我没有意识到这个(无证?)限制PyTuple_SetItem。我的代码的结构方式使得将项目插入元组非常不方便,直到after元组本身已成为另一个对象的属性。因此,当需要填充元组中的项目时,元组已经具有更高的引用计数。

我可能必须重组我的代码,但我正在认真考虑暂时将 Tuple 上的引用计数设置为 1,插入项目,然后恢复原始引用计数。当然,我知道这是一个可怕的黑客行为,而不是任何永久的解决方案。无论如何,我想知道关于元组引用计数的要求是否是有记录的任何地方。它只是 CPython 的实现细节,还是 API 用户可以依赖的预期行为?


我确信您可以通过使用来绕过限制PyTuple_SET_ITEM代替PyTuple_SetItem. PyTuple_SET_ITEM是一个定义在的宏tupleobject.h如下:

#define PyTuple_SET_ITEM(op, i, v) (((PyTupleObject*)(op))->ob_item[i] = v

因此,如果您绝对、绝对、完全确定:

  1. op是一个元组对象
  2. 你还没有初始化槽i到目前为止的元组中
  3. 你拥有对v你想让元组偷走它并且
  4. 在调用之前,另一个 Python 对象不可能使用该元组来执行任何操作PyTuple_SET_ITEM

那么我猜你可以安全使用PyTuple_SET_ITEM.

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

PyTuple_SetItem 的限制 的相关文章

  • 表达式中的 Python 'in' 关键字与 for 循环中的比较 [重复]

    这个问题在这里已经有答案了 我明白什么是in运算符在此代码中执行的操作 some list 1 2 3 4 5 print 2 in some list 我也明白i将采用此代码中列表的每个值 for i in 1 2 3 4 5 print
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 在 Python 类中动态定义实例字段

    我是 Python 新手 主要从事 Java 编程 我目前正在思考Python中的类是如何实例化的 我明白那个 init 就像Java中的构造函数 然而 有时 python 类没有 init 方法 在这种情况下我假设有一个默认构造函数 就像
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 如何从 pandas 数据帧计算 jaccard 相似度

    我有一个数据框如下 框架的形状是 1510 1399 列代表产品 行代表用户为给定产品分配的值 0 或 1 我怎样才能计算jaccard similarity scores 我创建了一个占位符数据框 列出了产品与产品 data ibs pd
  • AccessDenied:用户无权执行:cloudfront:CreateInvalidation

    我正在尝试使用 ember cli deploy 和 ember cli deploy cloudfront 将 ember 应用程序部署到 AWS CloudFront 我在 AWS 中设置了存储桶和用户 并为我的用户提供了 Amazon
  • 如何处理 Angular 2 中的模板错误(和其他错误)?

    当 Angular 2 中出现模板错误时 整个应用程序将无法工作 是否应该只有具有导致错误的模板的组件无法工作而应用程序的其余部分工作正常 如何处理错误以便应用程序在发生错误时不会停止响应 您可以使用自定义ErrorHandler http
  • 如何将 Kotlin 源文件转换为 Java 源文件

    我有一个 Kotlin 源文件 但我想将其转换为 Java 如何将 Kotlin 源代码转换为 Java 源代码 正如 Vadzim 所说 在 IntelliJ 或 Android Studio 中 您只需执行以下操作即可从 kotlin
  • 如何使用 View 的子级制作绘图动画,逐条绘制每条 Path 的线条?

    使用我在中找到的代码这个 StackOverflow 答案 https stackoverflow com a 61843394 3692177我成功地可以用手指在画布上绘制任何内容 并且在绘制时我会看到我绘制的内容 由此 我想创建一个在按
  • 来自守护程序的错误响应:未找到网络 myapp

    我正在尝试在多主机网络中创建一个容器 但在创建时出现此错误 Error response from daemon network myapp not found Here myapp是我创建的覆盖网络的名称 我正在使用的命令是 sudo d
  • Xcode 4 内部编译器错误:总线错误

    Xcode 4 0 1 开始出现内部编译器错误 它只是说 总线错误 它出现在我的一个 m 文件的底部 该文件现在几乎有 4000 行长 我看过这个问题 https stackoverflow com questions 5042256 in
  • StructureMap 和扫描组件

    因此 我有一个使用 StructureMap 的 NET 解决方案 并且我想让 StructureMap 读取一个外部程序集 该程序集实现该解决方案中项目的接口并为其定义注册表项 我的解决方案的 StructreMap 配置 ObjectF
  • 外部文件中的 JavaScript 未加载

    我有一个 JavaScript 问题 这个问题已经困扰我很长一段时间了 我有一个名为 search js 的外部文件 它与加载的 html 文件位于同一文件夹中 我在 HTML 中用来加载 javascript 文件的代码是 从我读过的所有
  • Postgres 函数总是返回一行

    我在 Postgres 中编写了以下函数 但遇到了一个问题 它总是返回一行 我的意思是 当没有用户匹配该对时 它会返回所有列为空的行 有没有办法让函数在没有结果时返回 0 零 行 CREATE OR REPLACE FUNCTION fin
  • Angular 2 全局常量提供程序注入器方法

    我有一个全局常量 例如根目录 我希望每个组件都可以访问它 在另一个 stackoverflow 问题中 答案是创建一个常量类并将其导入到每个组件中 有没有一种方法可以引导常量类 以便应用程序中的每个组件都可以访问它而无需任何额外的导入 到目
  • PHP:if (!$val) VS if (empty($val))。有什么区别吗?

    我想知道下面两种情况有什么区别 推荐哪一种 val 0 if val True if empty val It s also True 看看PHP类型对照表 http php net manual en types comparisons
  • @QueryParam 如何将没有值的参数转换为布尔值“false”?

    我想使用像这样的网址http www example com rest foo bar哪里的bar查询参数没有值 它的存在本身就应该表明变量是否是true or false 目前缺失值被假设为 空 并传递给new Boolean 将其视为f
  • XML(带有命名空间)到对象解组

    我从 Web 服务调用得到了以下响应 我尝试使用 JAXB 对其进行解组以将其映射到 java 类 这样做时我遇到了 unmarshal 异常
  • 使用扫描仪时无限循环? [复制]

    这个问题在这里已经有答案了 boolean z false do try a sc nextInt z true catch Exception e while z 尝试这个 如果您第一次尝试使用整数 它会正确执行 但是 如果您输入错误的文
  • Firebase orderByChild 和 equalTo() 查询不起作用

    我正在使用以下 Firebase 数据库表开发 Android 应用程序 posts id 1 author google 111527135678918251124 color 2960686 creationTime 142710414
  • aws cli get 错误“请求中包含的安全令牌无效”

    I did aws configure并测试它之前是否有效 但今天没用 我在尝试获取托管区域时收到错误 aws route53 list hosted zones An error occurred InvalidClientTokenId
  • Hudson 不会从 Git 获取

    我已经打了一天多了 这让我发疯了 我在Win7 PC上安装了Git 并选择 PuttyGen 选项 安装 我已经生成了 ssh 密钥 使用 PuttyGen 我已经添加了ssh 密钥到我的 Git 帐户 并链接 选美比赛中的私钥 我已经设置
  • 为 Bson.M mongodb 创建自定义 mashler/unmashler 时出错

    我收到错误WriteValueBytes can only write while positioned on a Element or Value but is positioned on a TopLevel当尝试为 bson M 创建
  • PyTuple_SetItem 的限制

    我有一个 Python 扩展模块 它创建一个元组作为另一个对象的属性 并在元组中设置项目 每当我在Python中执行这个模块时 我总是收到错误SystemError bad argument to internal function 阅读完