setup.py中的language_level对于cython有什么作用?

问题描述 投票:1回答:1

如果我在language_level=2中设置ext_modules = cythonize(extensions, language_level=2),那会有什么变化?只是我编写的代码应该被解释为Python2吗?

最终结果完全一样吗?

cython
1个回答
2
投票

构建cython扩展包括两个步骤:

  1. 使用PythonX + cython-module从foo.c文件创建foo.pyx文件。 X可以在这里2.7,3.7或任何你喜欢的版本。
  2. 借助编译器创建相应的so-file(或Windows上的pyd),包括PythonY和相应的共享库。这里Y不一定是X,但在大多数情况下YX是相同的。

得到的扩展可以与PythonY一起使用(它不起X所扮演的角色)。

但是,仍然有一个问题:在哪个Python版本中编写了原始的pyx文件?如果没有设置language_level,当前的Cython版本假设pyx文件是用2版本编写的(顺便说一句。这不是IPython的情况 - %% cython-magic,其中文件foo.c被cython化的版本) 。

这种行为将来会发生变化,这就是你看到有点刺激性警告的原因,如果你用cython>=0.29构建:

/Main.py:367:FutureWarning:未设置Cython指令'language_level',现在使用2(Py2)。这将在以后的版本中发生变化!文件:XXXXXX.pyx tree = Parsing.p_module(s, pxd, full_module_name)

因此,您可以显式设置language_level,以便您的扩展具有与Python版本相同的独立行为。

有关不同行为的一些示例,请参阅以下示例。

使用language_level=3

%%cython -3
print("I'm", "not a tuple")
print(5/4) 

结果是

I'm not a tuple
1.25  

但使用language_level=2

%%cython -2
print("I'm", "not a tuple")
print(5/4) 

结果是

("I'm", 'not a tuple')   # yet a tuple!
1                        # integer division in Python2!

显然上面只有两个例子,有更多的差异(例如strunicode的东西)。

© www.soinside.com 2019 - 2024. All rights reserved.