2 回答
TA贡献1842条经验 获得超21个赞
language_level
用于指示 pyx 文件是在哪个 Python 版本中编写的。因此,对于language_level=3
pyx 代码的结果行为,即使结果扩展是使用 Python2 运行的,它也好像是在 Python3 中执行的(请参阅此处的更详细说明)。
语言级别3str
的意思是“Python3 语义,但带有 str 文字(也在 Python2.7 中)”——因此str
在名称中。具体后果是什么?
Python3:内置/用于 Python3 时, level3
和 level之间没有区别3str
。
在 Python3 中,str
is unicode
,所以类型
# foo.pyx def test(): return type("aaa")
和将保持不变 ( str
) 。language_level=3
language_level=3str
Python2:使用/为 Python2 构建时,情况有所不同。language_level=3
上述-function的结果将test
是unicode
,language_level=3str
结果将是str
(在 Python2 中是字节)。而且对于 Python2,在所有其他情况下,3
都3str
具有相同的行为。
认为这是错误的
cdef char *c_string = "some string"
将无法构建language_level=3
(并3str
为 Python2 构建成功,因为“某些字符串”是bytes
),因为"some string"
unicode 和 unicode 文字只能强制转换为Py_UNICODE*
.
右侧的文字一开始不是 Python 对象,而只是生成的 C 代码中的 C 字符串。
TA贡献1862条经验 获得超7个赞
TLDR: 3str
不假设字符串文字在 Python2.x 下是 unicode,从而更容易从 Python2.x 迁移到 Python3。
不是一个完整的答案,因为我不知道突出差异的代码,这仍然为问题留下了空间,但这可能很有用,cython 0.29 中的新功能:
一个新的语言级别'
Cython 0.29 支持
language_level
指令的新设置language_level=3str
,它将成为 Cython 3.0 中新的默认语言级别。我们现在已经添加了它,这样用户就可以选择加入并立即从中受益,并且已经为即将到来的变化准备了他们的代码。这是一种“介于两者之间”的设置,它启用了所有与 Python 2.x 语法不兼容的 Python 3 好东西,但当编译的代码在 Python 2.x 中运行时,不需要所有无前缀的字符串文字都变成 Unicode 字符串. 这是一般 Py3 迁移中最大的问题之一。在 Cython 与 C 代码集成的上下文中,它对我们用户的影响甚至比在 Python 代码中要多一些。我们的目标是让来自 Python 3 的新用户更容易使用 Cython 编译他们的代码,并允许现有(Cython/Python 2)代码库在他们进行 100% 切换之前利用这些优势。
--embed[=<method_name>]
生成一个嵌入 Python 解释器的 main() 函数。-2
基于 Python-2 语法和代码语义进行编译。-3
基于 Python-3 语法和代码语义进行编译。--3str
基于 Python-3 语法和代码语义进行编译,而不假设 Python 2 下的字符串文字默认为 unicode。
最后由cython docs指出:
该
3str
选项启用 Python 3 语义,但不会将str
类型和无前缀字符串文字更改unicode
为编译后的代码在 Python 2.x 中运行时的值。
添加回答
举报