为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕运维8079593 2022-04-27 13:08:16
在即将到来的 Cython 3.0 版本中,language_level (在Cython 0.293str中引入)成为新的默认值而不是当前的默认值,即如果未设置 language_level(如何设置),我们会收到以下警告:2FutureWarning:Cython 指令“language_level”未设置,目前使用“3str”(Py3)。这与早期版本有所不同!文件:/home/ed/mygithub/cython/foo.pyx 树 = Parsing.p_module(s, pxd, full_module_name)但是语言级别3str和语言级别之间有什么区别?对于哪些代码,编译模块的行为和语言级别3会有什么不同?3str3
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

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=3str

Python2:使用/为 Python2 构建时,情况有所不同。language_level=3上述-function的结果将testunicodelanguage_level=3str结果将是str(在 Python2 中是字节)。而且对于 Python2,在所有其他情况下,33str具有相同的行为。


认为这是错误的

cdef char *c_string = "some string"

将无法构建language_level=3(并3str为 Python2 构建成功,因为“某些字符串”是bytes),因为"some string"unicode 和 unicode 文字只能强制转换为Py_UNICODE*.

右侧的文字一开始不是 Python 对象,而只是生成的 C 代码中的 C 字符串。


查看完整回答
反对 回复 2022-04-27
?
牧羊人nacy

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% 切换之前利用这些优势。

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 中运行时的值。


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 713 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信