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

问题描述:

我正在尝试更改Python 2.7代码,使它可以在2.7和3.6上运行。显而易见的问题是print。这就是所谓的没有括号在2.7与3.6括号所以,我试图运行时版本检测(从this answer采取检测代码):如何进行“打印”调用,以使代码在Python 2和Python 3中运行bot?

def customPrint(line): 
    if sys.version_info[0] < 3: 
     print "%s" % line 
    else: 
     print(line) 

,当我跑这条巨蟒3.6下,我得到一个错误信息说

SyntaxError: Missing parenthesis in call to 'print'

很显然,Python试图解释所有的代码。这与PHP不同。

如何使用print这样的自定义实现,它使用Python 2或Python 3中的print,具体取决于它在哪里运行?

+1

我想你可以有条件地从' __future__ import print_function'当你检测到Python 2 *。 –

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') 

做的最好的事情是使用导入告诉intepreter与函数调用替换关键字: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 
+0

我认为导入'print_function'是确保兼容性的唯一方法。 – erip

+1

否定的。在python2中,'print'是一个语句,从来不是一个函数。 'print(“hi”)'评估为print(“hi”)'。该声明中的括号没有任何用处。你会看到这个,如果你尝试print(“Hello”,“world”),它打印出一个元组,而不是一个字符串 – inspectorG4dget

+0

其次,不起作用。试试这里:http://interactivepython.org/runestone/static/pip/StringFormatting/interpolation.html – Joe

当您检测到Python 2时,您可以有条件地from __future__ import print_function *。

if sys.version_info[0] < 3: 
    from __future__ import print_function 

您在思考版本控制时有正确的想法。但是,python不会按照您的想法进行解释。代码首先被编译成字节码,然后运行(不像PERL)。这就是为什么你不能编写无限循环并实时编辑它,并期望它改变你看到的输出。

因此,您的语法仍然必须符合python3,即使在代码的python2部分。

解决此问题的一种方法是从__future__导入print_function。要做到这一点,下面的行添加到您的python脚本的顶部:

if sys.version_info[0] < 3: 
    from __future__ import print_function 

...,然后只用python3的print(...)甚至在你的代码的python2部分