在即将发布的Cython3.0版本中,3str language_level (与Cython 0.29一起引入)将成为新的默认设置,而不是当前的默认2,也就是说,如果language_level未设置(如何设置),则将收到以下警告:
FutureWarning: Cython指令'language_level‘没有设置,目前使用'3str’(Py3)。这已经改变了以前的版本!文件:/home/ed/mygithub/cython/foo.pyxtree= Parsing.p_module(s,pxd,full_module_name)
但是,3str和3语言级别之间有什么不同,使用3str和3语言级别编译的模块的行为会有哪些不同的代码呢?
发布于 2019-08-08 15:06:56
TLDR: 3str并不认为字符串文本是Python2.x下的unicode,因此从Python2.x迁移到Python3更容易。
不是一个完整的答案,因为我不知道突出区别的代码,这仍然为问题留出了空间,但这可能是有用的,Cython0.29有什么新发现?
--一种新的语言级‘ Cython0.29支持
language_level指令language_level=3str的新设置,它将成为Cython3.0中新的默认语言级别。我们现在已经添加了它,这样用户就可以立即选择并从中受益,并且已经为即将到来的更改准备了他们的代码。这是一种“介于之间”的设置,支持所有与Python2.x语法不兼容的不错的Python3,但是当编译的代码在Python2.x中运行时,不需要所有非前缀字符串字面值都成为Unicode字符串。这是一般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语法和代码语义进行编译,而不是默认情况下对Python2下的字符串进行unicode编译。
最后由cython文档指出
3str选项启用Python3语义,但在Python2.x中运行编译代码时,它不会将str类型和无前缀字符串文字更改为unicode。
发布于 2019-08-13 05:25:11
language_level用于指示在哪个Python中编写pyx-文件。因此,对于language_level=3,pyx代码的结果行为就好像它是在Python3中执行的,即使结果扩展是用Python2运行的(请参阅更详细的解释这里)。
语言级别3str的意思是"Python3语义,但使用str文本(也在Python2.7中)“--因此名字中有str。后果到底是什么?
Python3 :当内置/为Python3时,级别3和级别3str之间没有区别。
在Python3中,str是unicode,所以
# foo.pyx
def test():
return type("aaa")将保持不变(str)对language_level=3和language_level=3str。
Python2 :使用/为Python2构建时的情况不同。对于language_level=3,上面的test-function的结果将是unicode,而对于language_level=3str,结果将是str (在Python2中是字节)。但对于Python2,在所有其他情况下,3和3str都有相同的行为。
如果你认为,
cdef char *c_string = "some string"将无法使用language_level=3进行构建(并成功地使用3str for Python2构建,因为“一些字符串”是bytes),因为"some string"是unicode,而unicode的文字只能强制使用Py_UNICODE*。
右边的文字不是Python对象,而是生成的C代码中的一个C字符串。
https://stackoverflow.com/questions/57415446
复制相似问题