如何进行“打印”调用,以使代码在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
,具体取决于它在哪里运行?
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
我认为导入'print_function'是确保兼容性的唯一方法。 – erip
否定的。在python2中,'print'是一个语句,从来不是一个函数。 'print(“hi”)'评估为print(“hi”)'。该声明中的括号没有任何用处。你会看到这个,如果你尝试print(“Hello”,“world”),它打印出一个元组,而不是一个字符串 – inspectorG4dget
其次,不起作用。试试这里: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部分
我想你可以有条件地从' __future__ import print_function'当你检测到Python 2 *。 –