我正在尝试更改Python 2.7代码,以便它可以在2.7和3.6上运行。显而易见的问题是print
。它在2.7中没有括号而在3.6中用括号调用所以我尝试了运行时版本检测(检测代码取自this answer):
def customPrint(line):
if sys.version_info[0] < 3:
print "%s" % line
else:
print( line )
当我在Python 3.6下运行时,我收到一条错误消息
SyntaxError:调用'print'
时缺少括号
很明显,Python试图解释所有代码。这与PHP不同。
我如何使用print
的自定义实现,它使用来自Python 2的print
或Python 3,具体取决于它的运行位置?
答案 0 :(得分:3)
print
是python2.7中的关键字,它将接受一个元组作为下一段语法,使其看起来像一个函数调用:
Python 2.7.3 (default, Jun 21 2016, 18:38:19)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'hi'
hi
>>> print("hi")
hi
如果您使用字符串元组,这可能会产生误导,例如:
>>> print("hello", "world")
('hello', 'world')
最好的办法是使用导入告诉解释器用函数调用替换关键字:from __future__ import print_function
>>> from __future__ import print_function
>>> print("hi!")
hi!
>>> print "hi"
File "<stdin>", line 1
print "hi"
^
SyntaxError: invalid syntax
>>> print("hello", "world")
hello world
答案 1 :(得分:1)
您在考虑版本控制方面有正确的想法。但是,python并没有按照你的想法进行解释。首先将代码编译为字节码,然后运行(与PERL不同)。这就是为什么你不能写一个无限的while循环并实时编辑它并期望它改变你看到的输出。
因此,您的语法仍然必须符合python3,即使在代码的python2部分也是如此。
解决此问题的一种方法是从print_function
导入__future__
。为此,请将以下行添加到python脚本的顶部:
if sys.version_info[0] < 3:
from __future__ import print_function
...然后使用python3&#39; s print(...)
甚至在代码的python2部分
答案 2 :(得分:0)
当您检测到Python 2。*。
时,您可以有条件地from __future__ import print_function
if sys.version_info[0] < 3:
from __future__ import print_function