限制

此页面过去列出了 Cython 中导致编译代码语义与 Python 中语义不同的错误。Cython 0.15 版本修复了大多数缺失的功能。计划在 Cython 的未来版本中提供完整的 Python 语言兼容性。目前,问题跟踪器可以提供我们已知并希望修复的偏差概述。

https://github.com/cython/cython/labels/Python%20Semantics

以下是我们可能不会解决的差异列表。大多数这些差异属于实现细节而不是语义,我们可能决定不修复(或需要使用 –pedantic 标志才能修复)。

嵌套元组参数解包

def f((a,b), c):
    pass

此功能在 Python 3 中已移除。

检查支持

虽然在 Cython 的函数类型中模拟函数接口是完全可能的,并且最近的 Cython 版本在这方面取得了很大进步,但“inspect”模块不认为 Cython 实现的函数是“函数”,因为它显式地测试了对象类型,而不是比较抽象接口或抽象基类。这对使用 inspect 检查函数对象的代码有负面影响,但需要更改 Python 本身。

堆栈帧

目前,我们在异常传播过程中生成虚假的回溯,但不会填充局部变量,也无法填充 co_code。为了完全兼容,我们必须在函数调用时生成这些堆栈帧对象(可能会导致性能下降)。我们可能有一个选项可以启用此功能以进行调试。

推断字面量的标识与相等性

a = 1.0          # a inferred to be C type 'double'
b = c = None     # b and c inferred to be type 'object'
if some_runtime_expression:
    b = a        # creates a new Python float object
    c = a        # creates a new Python float object
print(b is c)     # most likely not the same object