【问题标题】:Check in C if a PyObject is Cython function如果 PyObject 是 Cython 函数,则检查 C
【发布时间】:2018-09-06 02:59:00
【问题描述】:

我在 C++ 应用程序中嵌入了 Python 2.7,并使用 Cython 将一些模块从纯 python 编译成 c,然后编译成共享对象。

Cython 编译的模块函数的类型与 python 纯函数完全不同。

type(func) # <type 'cython_function_or_method'>

有没有办法使用 Python C-API 来检查 PyList_Check 这样的类型。 或者 Cython 是否提供了一个 C-api 接口,可以像 Python.h 一样使用?

谢谢

【问题讨论】:

    标签: cython


    【解决方案1】:

    Cython 函数的类型为 PyCFunction,而不是类型为 PyFunction 的普通纯 Python 函数(名称中缺少 C 会有所不同!)。

    因此,您可以使用PyCFunction_Check 检查手头的功能是否可能是 Cython 功能。

    CPython 有很多功能可以通过from cpython cimport XXXX 导入。然而,并非所有功能都被包装,也不是PyCFunction_Check

    但这不是问题,因为可以很容易地从Python.h导入:

    %%cython
    cdef extern from "Python.h":
        int PyCFunction_Check(object obj)
    
    def is_cython_function(obj):
        return PyCFunction_Check(obj)!=0
    

    这有点脏,因为PyCFunction_Check 是一个定义而不是一个函数,但它仍然可以工作。

    现在:

    def dummy():
        pass
    
    is_cython_function(dummy)   #  False
    is_cython_function(is_cython_function) # True
    

    但是,函数“is_cython_function”的名称有些误导 - 每个内置函数都将是 True

    is_cython_function(abs)  # True
    

    但是,通常你对函数是否来自 cython 不感兴趣,但它是否属于 PyCFunction 类型(顺便说一句,对我来说,type(is_cython_function) 说:“&lt;type 'builtin_function_or_method'&gt;”。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 2023-03-02
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      相关资源
      最近更新 更多