This commit is contained in:
Benjamin Peterson 2012-11-29 10:58:43 -05:00
commit 4089eec098
3 changed files with 22 additions and 6 deletions

View file

@ -165,7 +165,7 @@ def parenthesize(node):
consuming_calls = set(["sorted", "list", "set", "any", "all", "tuple", "sum", consuming_calls = set(["sorted", "list", "set", "any", "all", "tuple", "sum",
"min", "max"]) "min", "max", "enumerate"])
def attr_chain(obj, attr): def attr_chain(obj, attr):
"""Follow an attribute chain. """Follow an attribute chain.
@ -192,14 +192,14 @@ p0 = """for_stmt< 'for' any 'in' node=any ':' any* >
p1 = """ p1 = """
power< power<
( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' | ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
'any' | 'all' | (any* trailer< '.' 'join' >) ) 'any' | 'all' | 'enumerate' | (any* trailer< '.' 'join' >) )
trailer< '(' node=any ')' > trailer< '(' node=any ')' >
any* any*
> >
""" """
p2 = """ p2 = """
power< power<
'sorted' ( 'sorted' | 'enumerate' )
trailer< '(' arglist<node=any any*> ')' > trailer< '(' arglist<node=any any*> ')' >
any* any*
> >
@ -207,14 +207,14 @@ power<
pats_built = False pats_built = False
def in_special_context(node): def in_special_context(node):
""" Returns true if node is in an environment where all that is required """ Returns true if node is in an environment where all that is required
of it is being itterable (ie, it doesn't matter if it returns a list of it is being iterable (ie, it doesn't matter if it returns a list
or an itterator). or an iterator).
See test_map_nochange in test_fixers.py for some examples and tests. See test_map_nochange in test_fixers.py for some examples and tests.
""" """
global p0, p1, p2, pats_built global p0, p1, p2, pats_built
if not pats_built: if not pats_built:
p1 = patcomp.compile_pattern(p1)
p0 = patcomp.compile_pattern(p0) p0 = patcomp.compile_pattern(p0)
p1 = patcomp.compile_pattern(p1)
p2 = patcomp.compile_pattern(p2) p2 = patcomp.compile_pattern(p2)
pats_built = True pats_built = True
patterns = [p0, p1, p2] patterns = [p0, p1, p2]

View file

@ -2981,6 +2981,10 @@ class Test_filter(FixerTestCase):
self.unchanged(a) self.unchanged(a)
a = """sorted(filter(f, 'abc'), key=blah)[0]""" a = """sorted(filter(f, 'abc'), key=blah)[0]"""
self.unchanged(a) self.unchanged(a)
a = """enumerate(filter(f, 'abc'))"""
self.unchanged(a)
a = """enumerate(filter(f, 'abc'), start=1)"""
self.unchanged(a)
a = """for i in filter(f, 'abc'): pass""" a = """for i in filter(f, 'abc'): pass"""
self.unchanged(a) self.unchanged(a)
a = """[x for x in filter(f, 'abc')]""" a = """[x for x in filter(f, 'abc')]"""
@ -3089,6 +3093,10 @@ class Test_map(FixerTestCase):
self.unchanged(a) self.unchanged(a)
a = """sorted(map(f, 'abc'), key=blah)[0]""" a = """sorted(map(f, 'abc'), key=blah)[0]"""
self.unchanged(a) self.unchanged(a)
a = """enumerate(map(f, 'abc'))"""
self.unchanged(a)
a = """enumerate(map(f, 'abc'), start=1)"""
self.unchanged(a)
a = """for i in map(f, 'abc'): pass""" a = """for i in map(f, 'abc'): pass"""
self.unchanged(a) self.unchanged(a)
a = """[x for x in map(f, 'abc')]""" a = """[x for x in map(f, 'abc')]"""
@ -3152,6 +3160,10 @@ class Test_zip(FixerTestCase):
self.unchanged(a) self.unchanged(a)
a = """sorted(zip(a, b), key=blah)[0]""" a = """sorted(zip(a, b), key=blah)[0]"""
self.unchanged(a) self.unchanged(a)
a = """enumerate(zip(a, b))"""
self.unchanged(a)
a = """enumerate(zip(a, b), start=1)"""
self.unchanged(a)
a = """for i in zip(a, b): pass""" a = """for i in zip(a, b): pass"""
self.unchanged(a) self.unchanged(a)
a = """[x for x in zip(a, b)]""" a = """[x for x in zip(a, b)]"""

View file

@ -143,6 +143,10 @@ Library
- Issue #16333: use (",", ": ") as default separator when indent is specified - Issue #16333: use (",", ": ") as default separator when indent is specified
to avoid trailing whitespace. Patch by Serhiy Storchaka. to avoid trailing whitespace. Patch by Serhiy Storchaka.
- Issue #16573: In 2to3, treat enumerate() like a consuming call, so superfluous
list() calls aren't added to filter(), map(), and zip() which are directly
passed enumerate().
- Issue #16549: Make json.tool work again on Python 3 and add tests. - Issue #16549: Make json.tool work again on Python 3 and add tests.
Initial patch by Berker Peksag and Serhiy Storchaka. Initial patch by Berker Peksag and Serhiy Storchaka.