Cython 的 language_level 3 和 3str 有什么区别?

在即将到来的 Cython 3.0 版本中,language_level (在Cython 0.293str中引入)成为新的默认值而不是当前的默认值,即如果未设置 language_level(如何设置),我们会收到以下警告:2

FutureWarning:Cython 指令“language_level”未设置,目前使用“3str”(Py3)。这与早期版本有所不同!文件:/home/ed/mygithub/cython/foo.pyx 树 = Parsing.p_module(s, pxd, full_module_name)

但是语言级别3str和语言级别之间有什么区别?对于哪些代码,编译模块的行为和语言级别3会有什么不同?3str3


慕运维8079593
浏览 681回答 2
2回答

茅侃侃

language_level用于指示 pyx 文件是在哪个 Python 版本中编写的。因此,对于language_level=3pyx 代码的结果行为,即使结果扩展是使用 Python2 运行的,它也好像是在 Python3 中执行的(请参阅此处的更详细说明)。语言级别3str的意思是“Python3 语义,但带有 str 文字(也在 Python2.7 中)”——因此str在名称中。具体后果是什么?Python3:内置/用于 Python3 时, level3和 level之间没有区别3str。在 Python3 中,stris unicode,所以类型# foo.pyx def test():        return type("aaa")和将保持不变 ( str) 。language_level=3language_level=3strPython2:使用/为 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 字符串。

牧羊人nacy

TLDR:&nbsp;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 字符串.&nbsp;这是一般 Py3 迁移中最大的问题之一。在 Cython 与 C 代码集成的上下文中,它对我们用户的影响甚至比在 Python 代码中要多一些。我们的目标是让来自 Python 3 的新用户更容易使用 Cython 编译他们的代码,并允许现有(Cython/Python 2)代码库在他们进行 100% 切换之前利用这些优势。Debian 的 cython 手册页也指出:--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 中运行时的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python