2to3转换后如何解决print((((双括号)?

时间:2019-04-07 14:08:01

标签: python-3.x sed python-2to3

当我将项目迁移到Python 3(2to3-3.7 -w -f print *)时,我观察到(但不是全部)打印语句的 lot 变成了print((...)),因此这些现在,语句将打印元组,而不是执行预期的行为。我了解到,如果我使用-p,那么我会处于一个更好的位置,因为from __future__ import print_function位于每个受影响的模块的顶部。

我正在考虑尝试使用sed修复此问题,但是在此之前,我想知道是否还有其他人对此进行过处理。有2to3功能可以清理吗?

要做,使用版本控制(git),并且前后都有提交(以及2to3创建的.bak文件),但是我不确定如何隔离我的更改从打印情况来看。

3 个答案:

答案 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")和真正的函数调用)。