You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cython编译错误:函数签名与先前声明不兼容

Cython方法签名不兼容问题解决

问题代码

文件 orderbook.pyx

from .constants import Side

cdef class OrderBook:
    cpdef set_order(self, side: Side, order: dict):
        pass

文件 orderbook.pxd

from .constants import Side

cdef class OrderBook:
    cpdef set_order(self, side: Side, order: dict)

文件 constants.pxd

cpdef enum Side:
    BUY = 1
    SELL = 2

编译错误信息

Error compiling Cython file:
------------------------------------------------------------
...
from .constants import Side


cdef class OrderBook:
    cpdef set_order(self, side: Side, order: dict):
          ^
------------------------------------------------------------

orderbook.pyx:12:10: Signature not compatible with previous declaration

Error compiling Cython file:
------------------------------------------------------------
...

from .constants import Side

cdef class OrderBook:
    cpdef set_order(self, side: Side, order: dict)
                   ^
------------------------------------------------------------

./orderbook.pxd:5:19: Previous declaration is here

解决方案

问题根源是Cython对.pxd接口文件的类型注解解析逻辑:.pxd中不直接认可dict作为类型标识,但.pyx实现文件可以直接使用该写法,导致两边签名匹配失败。

只需修改orderbook.pxd中的方法签名,将order: dict替换为order: object——object是Cython中通用的Python对象类型,可正确指代dict这类Python内置对象。

修改后的orderbook.pxd:

from .constants import Side

cdef class OrderBook:
    cpdef set_order(self, side: Side, order: object)

也可以同步修改orderbook.pyx中的order: dict为order: object,让两边签名完全一致,编译即可通过。

如果需要更底层的类型控制,也可以在.pxd中导入cpython.dict后使用PyDictObject*作为类型,但这种C级别的声明仅在需要直接操作dict底层结构时使用,日常场景用object更简洁。

内容的提问来源于stack exchange,提问作者baldr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:18