函数窃取引用时的 Cython 函数声明

2023-12-29

例如,有一些 Python C-API 函数会窃取一个传递参数的引用PyList_SetItem https://docs.python.org/c-api/list.html#c.PyList_SetItem,而另一些则增加参数的引用计数,例如PyList_Append https://docs.python.org/c-api/list.html#c.PyList_Append.

我可以告诉 Cython 该引用将被盗吗?或者我需要使用Py_INCREF手动?

from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF

cdef extern from "Python.h":
    void PyList_SetItem(object list, Py_ssize_t i, object o)

cpdef void func(list lst, object item):
    Py_INCREF(item)
    PyList_SetItem(lst, 0, item)

我知道如果一个函数返回借用的引用,则可以更改返回类型(PyObject *对于借用的参考资料,object对于非借用的):

from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF

cdef extern from "Python.h":
    PyObject* PyList_GetItem(object list, Py_ssize_t index)
    object PyObject_GetItem(object o, object key)

但这似乎不适用于被盗的参考文献(或者我的想法是错误的?):

from cpython.object cimport PyObject

cdef extern from "Python.h":
    void PyList_SetItem(object list, Py_ssize_t i, PyObject *o)

cpdef void func(list lst, object item):
    PyList_SetItem(lst, 0, <PyObject*>item)

Cython 中没有自动处理“窃取”的方法(yet?) https://github.com/cython/cython/issues/2722,所以人们必须退回到有点尴尬的手动处理(正如问题本身所指出的):

%%cython
from cpython.ref cimport Py_INCREF
from cpython.list cimport PyList_SetItem

def replace(list lst, object item):
    Py_INCREF(item) # prepare for stealing 
    PyList_SetItem(lst, 0, item)

行为符合预期:

import sys
a, b= float(), float()
lst = [a]
print(sys.getrefcount(a), sys.getrefcount(b))
# refcount(a)=3 and refcount(b)=2
replace(lst, b)
print(sys.getrefcount(a), sys.getrefcount(b))
# refcount(a)=3 and refcount(b)=2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数窃取引用时的 Cython 函数声明 的相关文章

随机推荐

  • 是否可以将 MKS Integrity 存储库导入 git 中?

    我只需要源树及其历史记录 我现在不关心需求 问题 我用命令行玩了一下 看看是否可以获得主干和一些开发路径的更改包列表 我认为应该可以为每个更改包提取差异 并使用它来重放自 git 中第一次提交以来的所有更改 像这样的东西 获取第一个提交并将
  • !clrstack -p 不给出调用堆栈中方法的参数值

    我们正在尝试使用 Windbg 分析 w3wp 内存转储 我们发现 w3wp 进程由于堆栈溢出而崩溃 我加载了 psscor4 dll 并通过发出 clrstack 获取了调用堆栈 但我也想知道传递给方法的参数 如果我发出 clrstack
  • 从自定义视图启动 AsyncTask 的最佳实践

    产生耗时的计算线程是很常见的 稍后我们需要更新Activity or Fragment与计算结果 我一直遵循以下准则 到目前为止 它对我来说效果很好 AsyncTask需要onPostExecute UI Fragment Use setR
  • Angular-ui-bootstrap 模式和打字稿

    我正在将 ngDialog 与 Angular 和 Typescript 一起使用 但是我正在尝试更改为 Angular ui boostrap 模式 因为它看起来更酷且更易于使用 我有一个场景 我使用例如 AddressListContr
  • WebView.loadUrl() 中的 Android JS

    我想在 WebView 中加载网页 但删除网页的部分内容 因此 我创建了一个自定义 WebViewClient 并且 在 onPageFinished 中 我执行了一些 javascript 来删除一些元素 然后 我使 WebView 可见
  • -ms-transform 不适用于 IE10(及以下版本)中的表头组 (thead)

    谁能帮我找到一种方法让 ms transform 在表头上工作 上下文是 我正在重新定位标题 使用 Javascript 和 CSS 转换 以使其在用户向下滚动到标题不再可见的位置时粘在屏幕顶部 并且使用如果没有可见的列标题 我可能也无法读
  • Javascript 中数组的每个元素的 toString() [重复]

    这个问题在这里已经有答案了 我想查找一个元素 可能是字符串或数字 是否位于数组内 数组是test元素是value 到目前为止一切顺利 我有这个代码 function compare value test We need to stringi
  • 是否可以在 FromURI 和 FromBody 上创建参数绑定?

    我查找了 ASP NET Web API 参数绑定的文档 它们似乎只有 fromURI 和 fromBody 是否可以两者兼得 这是一些背景信息 我正在创建一个 webhook 接收器 处理程序 我可以控制哪个 URL 是 webhook
  • 如何在选择下拉框中应用填充?

    我有两种类型的输入 Aselect下拉框和常规input On the input 我添加了一个padding 10px 这使它看起来很大 问题是 一旦我将选择框放在它旁边 它们的高度就不同了 如何将填充应用于选择 或使其与选择的高度相同i
  • 如何列出已停止的 Docker 容器中的文件

    这个问题 https stackoverflow com questions 34429757 how to copy file to stopped docker container演示如何从已停止的容器中复制文件 这要求我知道文件的完整
  • Swift SKShapeNode shapeWithSplinePoints

    我正在尝试为要遵循的节点创建 CGPath 但是当我尝试使用 608 hd best practices for building spritekit games 的操作和常量幻灯片中定义的 SKShapeNode 时 我收到错误调用中的额
  • Django 模型是否知道它是从哪个数据库加载的以及如何访问此信息?

    例如 我们有这样的代码 for book in myapp models Book objects using alternate database all book save 将书籍保存到 alternate database 或到 de
  • 如何根据另一列中的值将函数应用于 Pandas 中的列?

    预先感谢您的阅读 我有一个数据框 df pd DataFrame Words Sec level Sec levels Sec level Und ba Pro conf ProAbb cth Conflict None None None
  • uitableview cellforrowatindexpath 未调用,但调用了节中的行数

    在我的表视图中 没有调用section方法中的行 并且它返回值17 但是没有调用cellforrowatindexpath 我已在此方法的第一行中放置了断点 但在调试时从未显示这一点 我已遵循tableviewdelegate和数据源 以及
  • 部分视图中的 ASP.NET MVC 自定义类型列表

    我有一个采用分页列表的视图 如书呆子晚餐示例中所示 该页面按预期工作 现在我添加了一个采用相同 PagulatedList 的部分视图 并在第一个视图中调用 RnederPartial ASP NET 抛出一个我似乎无法解决的异常 分页列表
  • Android:共享图像意图无法与 Facebook 配合使用?

    您好 我有以下代码来共享图像 Share Intent share new Intent Intent ACTION SEND share setType image jpeg Uri uri Uri parse getFilesDir F
  • Spring MockMvc-请求参数列表

    我正在尝试使用 MockMvc 测试几个控制器端点 但遇到了一些麻烦 请友善 我是新手 使用字符串作为参数的简单端点工作正常 但使用字符串列表的稍微复杂的端点则不满意并抛出异常 有人能指出我做错了什么吗 RestController Req
  • 如何让 Ruby 诅咒正确响应箭头键?

    TL DR 如何让 Ruby 诅咒正确响应箭头键 KEY UP 常量似乎与我的输入不匹配 环境及问题描述 I am running Ruby 2 1 2 with the curses 1 0 1 gem https github com
  • 移动浏览器中 $(window).scroll 事件的触发率

    I use window scroll 向我的元素添加动画的事件 在桌面浏览器中 当鼠标移动时会触发该事件滚动 在移动浏览器中 当拖动和触摸时会触发该事件ended 有什么办法可以使scroll 当触摸拖动 向下 向上滚动 时触发事件 示例
  • 函数窃取引用时的 Cython 函数声明

    例如 有一些 Python C API 函数会窃取一个传递参数的引用PyList SetItem https docs python org c api list html c PyList SetItem 而另一些则增加参数的引用计数 例