我如何进行“打印”调用,使代码在Python 2和Python 3中运行?

时间:2017-08-02 15:35:49

标签: python python-2.7 python-3.x

我正在尝试更改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,具体取决于它的运行位置?

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