New submission from Peter: The 2to3 script should remove lines like this:
from future_builtins import zip after running the zip fixer which respects the meaning of this command (issue 217). It does not, which results in an ImportError when trying to use the converted code under Python 3. Similarly for lines like this after running the map fixer etc: from future_builtins import map Background: Python 2.6 and 2.7 have an iterator-style zip function in future_builtins (and other things): $ python2.6 Python 2.6.8 (unknown, Sep 28 2013, 12:09:28) [GCC 4.6.3] on linux3 Type "help", "copyright", "credits" or "license" for more information. >>> import future_builtins >>> dir(future_builtins) ['__doc__', '__file__', '__name__', '__package__', 'ascii', 'filter', 'hex', 'map', 'oct', 'zip'] >>> quit() $ python2.7 Python 2.7.1 (r271:86832, Dec 26 2010, 19:03:20) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import future_builtins >>> dir(future_builtins) ['__doc__', '__file__', '__name__', '__package__', 'ascii', 'filter', 'hex', 'map', 'oct', 'zip'] >>> quit() The future_builtins module does not exist under Python 3, in particular its zip and map functions do not exist. $ python3.3 Python 3.3.2 (default, Sep 28 2013, 12:00:20) [GCC 4.6.3] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import future_builtins Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named 'future_builtins' -------------------------------------------------- Sample script using zip which works under Python 2.6 and 2.7, $ more zip_2to3_bug.py from future_builtins import zip assert next(zip("abc", [1, 2, 3])) == ("a", 1) print "Done" $ python2.6 zip_2to3_bug.py Done $ python2.7 zip_2to3_bug.py Done Now let's use the 2to3 script (in place): $ 2to3 -w zip_2to3_bug.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored zip_2to3_bug.py --- zip_2to3_bug.py (original) +++ zip_2to3_bug.py (refactored) @@ -1,3 +1,3 @@ from future_builtins import zip assert next(zip("abc", [1, 2, 3])) == ("a", 1) -print "Done" +print("Done") Here's the (broken) output: $ more zip_2to3_bug.py from future_builtins import zip assert next(zip("abc", [1, 2, 3])) == ("a", 1) print("Done") This breaks: $ python3.3 zip_2to3_bug.py Traceback (most recent call last): File "zip_2to3_bug.py", line 1, in <module> from future_builtins import zip ImportError: No module named 'future_builtins' Expected output should respect the fact I am using "from future_builtins import zip" therefore zip as an iterator already (this is working), and then remove the line "from future_builtins import zip": $ more zip_2to3_bug.py assert next(zip("abc", [1, 2, 3])) == ("a", 1) print("Done") -------------------------------------------------- Sample script using zip which works under Python 2.6 and 2.7, $ more map_2to3_bug.py from future_builtins import map x = [-2, -1, 0, 1, 2, 3] y = next(map(abs, x)) assert y == 2 print "Done" $ python2.6 map_2to3_bug.py Done $ python2.7 map_2to3_bug.py Done Now let's use the 2to3 script (in place): $ 2to3 -w map_2to3_bug.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored map_2to3_bug.py --- map_2to3_bug.py (original) +++ map_2to3_bug.py (refactored) @@ -2,4 +2,4 @@ x = [-2, -1, 0, 1, 2, 3] y = next(map(abs, x)) assert y == 2 -print "Done" +print("Done") RefactoringTool: Files that were modified: RefactoringTool: map_2to3_bug.py Here's the (broken) output: $ more map_2to3_bug.py from future_builtins import map x = [-2, -1, 0, 1, 2, 3] y = next(map(abs, x)) assert y == 2 print("Done") This breaks: $ python3.3 map_2to3_bug.py Traceback (most recent call last): File "map_2to3_bug.py", line 1, in <module> from future_builtins import map ImportError: No module named 'future_builtins' Expected output should respect the fact I am using "from future_builtins import map" and therefore treat map according (this is working), and then remove the line "from future_builtins import map": $ more zip_2to3_bug.py x = [-2, -1, 0, 1, 2, 3] y = next(map(abs, x)) assert y == 2 print("Done") ---------- components: 2to3 (2.x to 3.x conversion tool) messages: 198521 nosy: maubp priority: normal severity: normal status: open title: 2to3 should remove from future_builtins import * type: behavior versions: Python 3.3 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue19111> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com