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

ead*_*ead 6 python cython

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

FutureWarning:未设置Cython指令'language_level',暂时使用'3str'(Py3)。这与以前的版本有所不同!文件:/home/ed/mygithub/cython/foo.pyx tree = Parsing.p_module(s,pxd,full_module_name)

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

Err*_*rse 5

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%转换之前利用这些好处。

Debian的cy​​thon手册也指出了这一点

--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中运行编译后的代码时的状态。