当我将项目迁移到Python 3(2to3-3.7 -w -f print *
)时,我观察到(但不是全部)打印语句的 lot 变成了print((...)),因此这些现在,语句将打印元组,而不是执行预期的行为。我了解到,如果我使用-p
,那么我会处于一个更好的位置,因为from __future__ import print_function
位于每个受影响的模块的顶部。
我正在考虑尝试使用sed修复此问题,但是在此之前,我想知道是否还有其他人对此进行过处理。有2to3功能可以清理吗?
我要做,使用版本控制(git),并且前后都有提交(以及2to3创建的.bak文件),但是我不确定如何隔离我的更改从打印情况来看。
答案 0 :(得分:3)
如果您的代码已经具有print()函数,则可以在2to3中使用-x print
参数来跳过转换。
答案 1 :(得分:2)
您已经在打印元组。如果不是,那么现在也不是。
为说明起见,您的代码必须一直使用print
,就好像它是一个函数一样:
# Python 2
print(somestring)
翻译后变成
# Python 3
print((somestring))
那不是元组,只是 一对括号。两种版本的结果相同。实际上,2to3
足够聪明,可以再次删除内括号。实际的输出结果只是
# Python 3
print(somestring)
但是,如果您在Python 2中使用多个参数,则
# Python 2
print(arg1, arg2)
那么您已经在打印元组了,因为这确实是
value_to_print = (arg1, arg2)
print value_to_print
因此,只有在Python 3中保留该行为才是正确的。如果看到2to3
工具使用print((....))
,则表明您已经在打印元组。
演示:
$ cat testprint.py
print('not a tuple')
print('two-value', 'tuple')
$ python2.7 testprint.py
not a tuple
('two-value', 'tuple')
$ 2to3 -w -f print testprint.py
RefactoringTool: Refactored testprint.py
--- testprint.py (original)
+++ testprint.py (refactored)
@@ -1,2 +1,2 @@
print('not a tuple')
-print('two-value', 'tuple')
+print(('two-value', 'tuple'))
RefactoringTool: Files that were modified:
RefactoringTool: testprint.py
$ python3.7 testprint.py
not a tuple
('two-value', 'tuple')
请注意,这与在Python 2代码中使用from __future__ import print_function
来禁用print
语句不同,因此使代码调用内置的print()
function < / em>。 2to3工具已经检测到这种情况,并将通过print(...)
函数调用保持不变:
$ cat futureprint.py
from __future__ import print_function
print('not', 'a tuple')
$ python2.7 futureprint.py
not a tuple
$ 2to3 -w -f print futureprint.py
RefactoringTool: No files need to be modified.
$ python3.7 futureprint.py
not a tuple
通过2to3
/ from __future__ import print_function
命令行开关,您可以强制-p
假定所有文件都使用--print-function
,
-p, --print-function Modify the grammar so that print() is a function
但是,任何故意 print (tuple_element1, tuple_element2, ...)
打印语句都将被误翻译为函数调用:
$ cat printtuple.py
print ('two-value', 'tuple')
$ python2.7 printtuple.py
('two-value', 'tuple')
$ 2to3 -w -f print -p printtuple.py
RefactoringTool: No files need to be modified.
$ python3.7 printtuple.py
two-value tuple
答案 2 :(得分:0)
尝试使用-p
标志。请参阅最后的注释here。
通过
-p
时,2to3将print作为函数而不是语句。当使用from __future__ import print_function
时,这很有用。如果未指定此选项,则打印修复程序将在打印调用中加上额外的括号,因为它无法区分带有括号的打印语句(例如print ("a" + "b" + "c")
和真正的函数调用)。