gpt4 book ai didi

python - 在 cython 类中包装一个预初始化的指针

转载 作者:太空狗 更新时间:2023-10-30 02:46:49 28 4
gpt4 key购买 nike

我正在尝试使用 C 库,它使用回调函数 (callback_function) 来提供指向我想要包装的结构 (glp_tree) 的指针。

使用不是在 __cinit__ 中创建的指针初始化实例的正确方法是什么?我在 cython 文档中找不到这种模式的示例。

我有一些工作代码(见下文),它将指针转换为整数并返回,但我不确定这是好的做法/理智。

cdef extern from "stdint.h":
ctypedef unsigned long long uint64_t

cdef extern from "glpk.h":
ctypedef struct glp_tree:
pass

cdef void callback_func(glp_tree* tree, void *info):
treeobj = Tree(<uint64_t>tree) // cast to an integer...

cdef class Tree:
cdef glp_tree* ptr
def __init__(self, uint64_t ptr):
self.ptr = <glp_tree*>ptr // ... and back to a pointer

直接传递 glp_tree 对象似乎可行(虽然这不是我想做的),但试图传递指针导致编译器错误:

Cannot convert 'glp_tree *' to Python object

最佳答案

除了使用 __init__/__cinit__(它总是期望 Python 对象作为参数),您可以使用自定义的 @staticmethod cdef 来创建实例:

cdef class Tree:
cdef glp_tree* ptr

def __init__(self, *args):
raise TypeError('Cannot create instance from Python')

@staticmethod
cdef Tree create(glp_tree* ptr):
obj = <Tree>Tree.__new__(Tree) # create instance without calling __init__
obj.ptr = ptr
return obj

关于python - 在 cython 类中包装一个预初始化的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18695402/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com