mirror of
https://github.com/python/cpython.git
synced 2024-12-04 07:15:09 +08:00
Merged revisions 61602 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ................ r61602 | martin.v.loewis | 2008-03-19 00:22:42 -0500 (Mi, 19 Mär 2008) | 17 lines Merged revisions 61598-61599,61601 via svnmerge from svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r61598 | david.wolever | 2008-03-18 23:58:33 -0500 (Di, 18 Mär 2008) | 1 line Added fixer for zip, and refactored a bit of code in the process. Closing #2171. ........ r61599 | david.wolever | 2008-03-19 00:04:26 -0500 (Mi, 19 Mär 2008) | 3 lines Removed a bunch of duplicate code -- it's in util now. ........ r61601 | martin.v.loewis | 2008-03-19 00:21:12 -0500 (Mi, 19 Mär 2008) | 2 lines Fix whitespace. ........ ................
This commit is contained in:
parent
ef04c44e29
commit
f733c60d9a
@ -39,7 +39,7 @@ class FixExcept(basefix.BaseFix):
|
||||
try_stmt< 'try' ':' suite
|
||||
cleanup=((except_clause ':' suite)+ ['else' ':' suite]
|
||||
['finally' ':' suite]
|
||||
| 'finally' ':' suite) >
|
||||
| 'finally' ':' suite) >
|
||||
"""
|
||||
|
||||
def transform(self, node, results):
|
||||
|
@ -14,11 +14,9 @@ Python 2.6 figure it out.
|
||||
"""
|
||||
|
||||
# Local imports
|
||||
from .. import pytree
|
||||
from .. import patcomp
|
||||
from ..pgen2 import token
|
||||
from . import basefix
|
||||
from .util import Name, Call, ListComp, attr_chain, does_tree_import
|
||||
from .util import Name, Call, ListComp, does_tree_import, in_special_context
|
||||
|
||||
class FixFilter(basefix.BaseFix):
|
||||
|
||||
@ -85,35 +83,3 @@ class FixFilter(basefix.BaseFix):
|
||||
new = Call(Name("list"), [new])
|
||||
new.set_prefix(node.get_prefix())
|
||||
return new
|
||||
|
||||
P0 = """for_stmt< 'for' any 'in' node=any ':' any* >
|
||||
| comp_for< 'for' any 'in' node=any any* >
|
||||
"""
|
||||
p0 = patcomp.compile_pattern(P0)
|
||||
|
||||
P1 = """
|
||||
power<
|
||||
( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
|
||||
'any' | 'all' | (any* trailer< '.' 'join' >) )
|
||||
trailer< '(' node=any ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
p1 = patcomp.compile_pattern(P1)
|
||||
|
||||
P2 = """
|
||||
power<
|
||||
'sorted'
|
||||
trailer< '(' arglist<node=any any*> ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
p2 = patcomp.compile_pattern(P2)
|
||||
|
||||
def in_special_context(node):
|
||||
patterns = [p0, p1, p2]
|
||||
for pattern, parent in zip(patterns, attr_chain(node, "parent")):
|
||||
results = {}
|
||||
if pattern.match(parent, results) and results["node"] is node:
|
||||
return True
|
||||
return False
|
||||
|
@ -13,4 +13,3 @@ class FixFuture(basefix.BaseFix):
|
||||
|
||||
def transform(self, node, results):
|
||||
return BlankLine()
|
||||
|
||||
|
@ -86,4 +86,4 @@ class FixImports(basefix.BaseFix):
|
||||
bare_name = bare_name[0]
|
||||
new_name = self.replace.get(bare_name.value)
|
||||
if new_name:
|
||||
bare_name.replace(Name(new_name, prefix=bare_name.get_prefix()))
|
||||
bare_name.replace(Name(new_name, prefix=bare_name.get_prefix()))
|
||||
|
@ -20,11 +20,9 @@ soon as the shortest argument is exhausted.
|
||||
"""
|
||||
|
||||
# Local imports
|
||||
from .. import pytree
|
||||
from .. import patcomp
|
||||
from ..pgen2 import token
|
||||
from . import basefix
|
||||
from .util import Name, Call, ListComp, attr_chain, does_tree_import
|
||||
from .util import Name, Call, ListComp, does_tree_import, in_special_context
|
||||
from ..pygram import python_symbols as syms
|
||||
|
||||
class FixMap(basefix.BaseFix):
|
||||
@ -92,35 +90,3 @@ class FixMap(basefix.BaseFix):
|
||||
new = Call(Name("list"), [new])
|
||||
new.set_prefix(node.get_prefix())
|
||||
return new
|
||||
|
||||
P0 = """for_stmt< 'for' any 'in' node=any ':' any* >
|
||||
| comp_for< 'for' any 'in' node=any any* >
|
||||
"""
|
||||
p0 = patcomp.compile_pattern(P0)
|
||||
|
||||
P1 = """
|
||||
power<
|
||||
( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
|
||||
'any' | 'all' | (any* trailer< '.' 'join' >) )
|
||||
trailer< '(' node=any ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
p1 = patcomp.compile_pattern(P1)
|
||||
|
||||
P2 = """
|
||||
power<
|
||||
'sorted'
|
||||
trailer< '(' arglist<node=any any*> ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
p2 = patcomp.compile_pattern(P2)
|
||||
|
||||
def in_special_context(node):
|
||||
patterns = [p0, p1, p2]
|
||||
for pattern, parent in zip(patterns, attr_chain(node, "parent")):
|
||||
results = {}
|
||||
if pattern.match(parent, results) and results["node"] is node:
|
||||
return True
|
||||
return False
|
||||
|
@ -17,6 +17,6 @@ class FixNe(basefix.BaseFix):
|
||||
return node.type == token.NOTEQUAL and node.value == "<>"
|
||||
|
||||
def transform(self, node, results):
|
||||
new = pytree.Leaf(token.NOTEQUAL, "!=")
|
||||
new.set_prefix(node.get_prefix())
|
||||
return new
|
||||
new = pytree.Leaf(token.NOTEQUAL, "!=")
|
||||
new.set_prefix(node.get_prefix())
|
||||
return new
|
||||
|
@ -47,12 +47,12 @@ class FixNext(basefix.BaseFix):
|
||||
mod = results.get("mod")
|
||||
|
||||
if base:
|
||||
if self.shadowed_next:
|
||||
attr.replace(Name("__next__", prefix=attr.get_prefix()))
|
||||
else:
|
||||
base = [n.clone() for n in base]
|
||||
base[0].set_prefix("")
|
||||
node.replace(Call(Name("next", prefix=node.get_prefix()), base))
|
||||
if self.shadowed_next:
|
||||
attr.replace(Name("__next__", prefix=attr.get_prefix()))
|
||||
else:
|
||||
base = [n.clone() for n in base]
|
||||
base[0].set_prefix("")
|
||||
node.replace(Call(Name("next", prefix=node.get_prefix()), base))
|
||||
elif name:
|
||||
n = Name("__next__", prefix=name.get_prefix())
|
||||
name.replace(n)
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
Change:
|
||||
'print' into 'print()'
|
||||
'print ...' into 'print(...)'
|
||||
'print ...' into 'print(...)'
|
||||
'print ... ,' into 'print(..., end=" ")'
|
||||
'print >>x, ...' into 'print(..., file=x)'
|
||||
"""
|
||||
|
@ -48,11 +48,11 @@ class FixRaise(basefix.BaseFix):
|
||||
# Since Python 3 will not support this, we recurse down any tuple
|
||||
# literals, always taking the first element.
|
||||
if is_tuple(exc):
|
||||
while is_tuple(exc):
|
||||
# exc.children[1:-1] is the unparenthesized tuple
|
||||
# exc.children[1].children[0] is the first element of the tuple
|
||||
exc = exc.children[1].children[0].clone()
|
||||
exc.set_prefix(" ")
|
||||
while is_tuple(exc):
|
||||
# exc.children[1:-1] is the unparenthesized tuple
|
||||
# exc.children[1].children[0] is the first element of the tuple
|
||||
exc = exc.children[1].children[0].clone()
|
||||
exc.set_prefix(" ")
|
||||
|
||||
if "val" not in results:
|
||||
# One-argument raise
|
||||
|
@ -67,4 +67,3 @@ class FixRenames(basefix.BaseFix):
|
||||
if mod_name and attr_name:
|
||||
new_attr = LOOKUP[(mod_name.value, attr_name.value)]
|
||||
attr_name.replace(Name(new_attr, prefix=attr_name.get_prefix()))
|
||||
|
||||
|
@ -15,8 +15,8 @@ class FixRepr(basefix.BaseFix):
|
||||
"""
|
||||
|
||||
def transform(self, node, results):
|
||||
expr = results["expr"].clone()
|
||||
expr = results["expr"].clone()
|
||||
|
||||
if expr.type == self.syms.testlist1:
|
||||
expr = self.parenthesize(expr)
|
||||
return Call(Name("repr"), [expr], prefix=node.get_prefix())
|
||||
if expr.type == self.syms.testlist1:
|
||||
expr = self.parenthesize(expr)
|
||||
return Call(Name("repr"), [expr], prefix=node.get_prefix())
|
||||
|
@ -8,21 +8,21 @@ from .import basefix
|
||||
|
||||
class FixUnicode(basefix.BaseFix):
|
||||
|
||||
PATTERN = "STRING | NAME<'unicode' | 'unichr'>"
|
||||
PATTERN = "STRING | NAME<'unicode' | 'unichr'>"
|
||||
|
||||
def transform(self, node, results):
|
||||
if node.type == token.NAME:
|
||||
if node.value == "unicode":
|
||||
new = node.clone()
|
||||
new.value = "str"
|
||||
return new
|
||||
if node.value == "unichr":
|
||||
new = node.clone()
|
||||
new.value = "chr"
|
||||
return new
|
||||
# XXX Warn when __unicode__ found?
|
||||
elif node.type == token.STRING:
|
||||
if re.match(r"[uU][rR]?[\'\"]", node.value):
|
||||
new = node.clone()
|
||||
new.value = new.value[1:]
|
||||
return new
|
||||
def transform(self, node, results):
|
||||
if node.type == token.NAME:
|
||||
if node.value == "unicode":
|
||||
new = node.clone()
|
||||
new.value = "str"
|
||||
return new
|
||||
if node.value == "unichr":
|
||||
new = node.clone()
|
||||
new.value = "chr"
|
||||
return new
|
||||
# XXX Warn when __unicode__ found?
|
||||
elif node.type == token.STRING:
|
||||
if re.match(r"[uU][rR]?[\'\"]", node.value):
|
||||
new = node.clone()
|
||||
new.value = new.value[1:]
|
||||
return new
|
||||
|
@ -11,29 +11,29 @@ from .import basefix
|
||||
|
||||
class FixWsComma(basefix.BaseFix):
|
||||
|
||||
explicit = True # The user must ask for this fixers
|
||||
explicit = True # The user must ask for this fixers
|
||||
|
||||
PATTERN = """
|
||||
any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]>
|
||||
"""
|
||||
PATTERN = """
|
||||
any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]>
|
||||
"""
|
||||
|
||||
COMMA = pytree.Leaf(token.COMMA, ",")
|
||||
COLON = pytree.Leaf(token.COLON, ":")
|
||||
SEPS = (COMMA, COLON)
|
||||
COMMA = pytree.Leaf(token.COMMA, ",")
|
||||
COLON = pytree.Leaf(token.COLON, ":")
|
||||
SEPS = (COMMA, COLON)
|
||||
|
||||
def transform(self, node, results):
|
||||
new = node.clone()
|
||||
comma = False
|
||||
for child in new.children:
|
||||
if child in self.SEPS:
|
||||
prefix = child.get_prefix()
|
||||
if prefix.isspace() and "\n" not in prefix:
|
||||
child.set_prefix("")
|
||||
comma = True
|
||||
else:
|
||||
if comma:
|
||||
prefix = child.get_prefix()
|
||||
if not prefix:
|
||||
child.set_prefix(" ")
|
||||
def transform(self, node, results):
|
||||
new = node.clone()
|
||||
comma = False
|
||||
return new
|
||||
for child in new.children:
|
||||
if child in self.SEPS:
|
||||
prefix = child.get_prefix()
|
||||
if prefix.isspace() and "\n" not in prefix:
|
||||
child.set_prefix("")
|
||||
comma = True
|
||||
else:
|
||||
if comma:
|
||||
prefix = child.get_prefix()
|
||||
if not prefix:
|
||||
child.set_prefix(" ")
|
||||
comma = False
|
||||
return new
|
||||
|
43
Lib/lib2to3/fixes/fix_zip.py
Normal file
43
Lib/lib2to3/fixes/fix_zip.py
Normal file
@ -0,0 +1,43 @@
|
||||
"""
|
||||
Fixer that changes zip(seq0, seq1, ...) into list(zip(seq0, seq1, ...)
|
||||
unless there exists a 'from future_builtins import zip' statement in the
|
||||
top-level namespace.
|
||||
|
||||
We avoid the transformation if the zip() call is directly contained in
|
||||
iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or for V in <>:.
|
||||
"""
|
||||
|
||||
# Local imports
|
||||
from . import basefix
|
||||
from .util import Name, Call, does_tree_import, in_special_context
|
||||
|
||||
class FixZip(basefix.BaseFix):
|
||||
|
||||
PATTERN = """
|
||||
power< 'zip' args=trailer< '(' [any] ')' >
|
||||
>
|
||||
"""
|
||||
|
||||
def start_tree(self, *args):
|
||||
super(FixZip, self).start_tree(*args)
|
||||
self._future_zip_found = None
|
||||
|
||||
def has_future_zip(self, node):
|
||||
if self._future_zip_found is not None:
|
||||
return self._future_zip_found
|
||||
self._future_zip_found = does_tree_import('future_builtins', 'zip', node)
|
||||
return self._future_zip_found
|
||||
|
||||
def transform(self, node, results):
|
||||
if self.has_future_zip(node):
|
||||
# If a future zip has been imported for this file, we won't
|
||||
# be making any modifications
|
||||
return
|
||||
|
||||
if in_special_context(node):
|
||||
return None
|
||||
new = node.clone()
|
||||
new.set_prefix("")
|
||||
new = Call(Name("list"), [new])
|
||||
new.set_prefix(node.get_prefix())
|
||||
return new
|
@ -5,6 +5,7 @@
|
||||
from ..pgen2 import token
|
||||
from ..pytree import Leaf, Node
|
||||
from ..pygram import python_symbols as syms
|
||||
from .. import patcomp
|
||||
|
||||
|
||||
###########################################################
|
||||
@ -180,6 +181,44 @@ def attr_chain(obj, attr):
|
||||
yield next
|
||||
next = getattr(next, attr)
|
||||
|
||||
p0 = """for_stmt< 'for' any 'in' node=any ':' any* >
|
||||
| comp_for< 'for' any 'in' node=any any* >
|
||||
"""
|
||||
p1 = """
|
||||
power<
|
||||
( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' |
|
||||
'any' | 'all' | (any* trailer< '.' 'join' >) )
|
||||
trailer< '(' node=any ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
p2 = """
|
||||
power<
|
||||
'sorted'
|
||||
trailer< '(' arglist<node=any any*> ')' >
|
||||
any*
|
||||
>
|
||||
"""
|
||||
pats_built = False
|
||||
def in_special_context(node):
|
||||
""" 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
|
||||
or an itterator).
|
||||
See test_map_nochange in test_fixers.py for some examples and tests.
|
||||
"""
|
||||
global p0, p1, p2, pats_built
|
||||
if not pats_built:
|
||||
p1 = patcomp.compile_pattern(p1)
|
||||
p0 = patcomp.compile_pattern(p0)
|
||||
p2 = patcomp.compile_pattern(p2)
|
||||
pats_built = True
|
||||
patterns = [p0, p1, p2]
|
||||
for pattern, parent in zip(patterns, attr_chain(node, "parent")):
|
||||
results = {}
|
||||
if pattern.match(parent, results) and results["node"] is node:
|
||||
return True
|
||||
return False
|
||||
|
||||
###########################################################
|
||||
### The following functions are to find bindings in a suite
|
||||
###########################################################
|
||||
@ -240,8 +279,8 @@ def find_binding(name, node, package=None):
|
||||
elif child.type == syms.simple_stmt:
|
||||
ret = find_binding(name, child, package)
|
||||
elif child.type == syms.expr_stmt:
|
||||
if _find(name, child.children[0]):
|
||||
ret = child
|
||||
if _find(name, child.children[0]):
|
||||
ret = child
|
||||
|
||||
if ret:
|
||||
if not package:
|
||||
|
@ -523,4 +523,4 @@ def diff_texts(a, b, filename):
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
sys.exit(main())
|
||||
|
@ -2493,6 +2493,69 @@ class Test_map(FixerTestCase):
|
||||
a = "from future_builtins import *; map(f, 'ham')"
|
||||
self.unchanged(a)
|
||||
|
||||
class Test_zip(FixerTestCase):
|
||||
fixer = "zip"
|
||||
|
||||
def check(self, b, a):
|
||||
self.unchanged("from future_builtins import zip; " + b, a)
|
||||
FixerTestCase.check(self, b, a)
|
||||
|
||||
def test_zip_basic(self):
|
||||
b = """x = zip(a, b, c)"""
|
||||
a = """x = list(zip(a, b, c))"""
|
||||
self.check(b, a)
|
||||
|
||||
b = """x = len(zip(a, b))"""
|
||||
a = """x = len(list(zip(a, b)))"""
|
||||
self.check(b, a)
|
||||
|
||||
def test_zip_nochange(self):
|
||||
a = """b.join(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """(a + foo(5)).join(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """iter(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """list(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """list(zip(a, b))[0]"""
|
||||
self.unchanged(a)
|
||||
a = """set(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """set(zip(a, b)).pop()"""
|
||||
self.unchanged(a)
|
||||
a = """tuple(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """any(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """all(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """sum(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """sorted(zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
a = """sorted(zip(a, b), key=blah)"""
|
||||
self.unchanged(a)
|
||||
a = """sorted(zip(a, b), key=blah)[0]"""
|
||||
self.unchanged(a)
|
||||
a = """for i in zip(a, b): pass"""
|
||||
self.unchanged(a)
|
||||
a = """[x for x in zip(a, b)]"""
|
||||
self.unchanged(a)
|
||||
a = """(x for x in zip(a, b))"""
|
||||
self.unchanged(a)
|
||||
|
||||
def test_future_builtins(self):
|
||||
a = "from future_builtins import spam, zip, eggs; zip(a, b)"
|
||||
self.unchanged(a)
|
||||
|
||||
b = """from future_builtins import spam, eggs; x = zip(a, b)"""
|
||||
a = """from future_builtins import spam, eggs; x = list(zip(a, b))"""
|
||||
self.check(b, a)
|
||||
|
||||
a = "from future_builtins import *; zip(a, b)"
|
||||
self.unchanged(a)
|
||||
|
||||
class Test_standarderror(FixerTestCase):
|
||||
fixer = "standarderror"
|
||||
|
||||
|
@ -407,10 +407,10 @@ class TestPatterns(support.TestCase):
|
||||
pe = pytree.LeafPattern(1, "e", "pe")
|
||||
pf = pytree.LeafPattern(1, "f", "pf")
|
||||
pw = pytree.WildcardPattern([[pa, pb, pc], [pd, pe],
|
||||
[pa, pb], [pc, pd], [pe, pf]],
|
||||
[pa, pb], [pc, pd], [pe, pf]],
|
||||
min=1, max=4, name="pw")
|
||||
self.assertEqual([x[0] for x in pw.generate_matches(leaves)],
|
||||
[3, 5, 2, 4, 6])
|
||||
[3, 5, 2, 4, 6])
|
||||
pr = pytree.NodePattern(type=1000, content=[pw], name="pr")
|
||||
matches = list(pytree.generate_matches([pr], [root]))
|
||||
self.assertEqual(len(matches), 1)
|
||||
|
Loading…
Reference in New Issue
Block a user