限制¶
此页面过去列出了 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