如果我在language_level=2
中设置ext_modules = cythonize(extensions, language_level=2)
,那会有什么变化?只是我编写的代码应该被解释为Python2吗?
最终结果完全一样吗?
构建cython扩展包括两个步骤:
foo.c
文件创建foo.pyx
文件。 X
可以在这里2.7,3.7或任何你喜欢的版本。Y
不一定是X
,但在大多数情况下Y
和X
是相同的。得到的扩展可以与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!
显然上面只有两个例子,有更多的差异(例如str
和unicode
的东西)。