annotate Lib/lib2to3/fixes/fix_map.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 119e4323400d
children 7700408f65fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 # Copyright 2007 Google, Inc. All Rights Reserved.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Licensed to PSF under a Contributor Agreement.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4 """Fixer that changes map(F, ...) into list(map(F, ...)) unless there
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5 exists a 'from future_builtins import map' statement in the top-level
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6 namespace.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 As a special case, map(None, X) is changed into list(X). (This is
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9 necessary because the semantics are changed in this case -- the new
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10 map(None, X) is equivalent to [(x,) for x in X].)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12 We avoid the transformation (except for the special case mentioned
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13 above) if the map() call is directly contained in iter(<>), list(<>),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 tuple(<>), sorted(<>), ...join(<>), or for V in <>:.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 NOTE: This is still not correct if the original code was depending on
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 map(F, X, Y, ...) to go on until the longest argument is exhausted,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 substituting None for missing values -- like zip(), it now stops as
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 soon as the shortest argument is exhausted.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 # Local imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 from ..pgen2 import token
47726
4e304aded7a8 Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45992
diff changeset
24 from .. import fixer_base
4e304aded7a8 Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45992
diff changeset
25 from ..fixer_util import Name, Call, ListComp, in_special_context
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 from ..pygram import python_symbols as syms
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27
47726
4e304aded7a8 Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45992
diff changeset
28 class FixMap(fixer_base.ConditionalFix):
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30 PATTERN = """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31 map_none=power<
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
32 'map'
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
33 trailer< '(' arglist< 'None' ',' arg=any [','] > ')' >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35 |
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 map_lambda=power<
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 'map'
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 trailer<
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 '('
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
40 arglist<
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41 lambdef< 'lambda'
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42 (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 ','
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45 it=any
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 ')'
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
49 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
50 |
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
51 power<
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 'map'
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 args=trailer< '(' [any] ')' >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 >
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56
45992
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
57 skip_on = 'future_builtins.map'
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59 def transform(self, node, results):
45992
e47c3c7bbddc Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
60 if self.should_skip(node):
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 return
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
62
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 if node.parent.type == syms.simple_stmt:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64 self.warning(node, "You should use a for loop here")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 new = node.clone()
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47726
diff changeset
66 new.set_prefix(u"")
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47726
diff changeset
67 new = Call(Name(u"list"), [new])
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 elif "map_lambda" in results:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69 new = ListComp(results.get("xp").clone(),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 results.get("fp").clone(),
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 results.get("it").clone())
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73 if "map_none" in results:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 new = results["arg"].clone()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 if in_special_context(node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77 return None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 new = node.clone()
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47726
diff changeset
79 new.set_prefix(u"")
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47726
diff changeset
80 new = Call(Name(u"list"), [new])
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 new.set_prefix(node.get_prefix())
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82 return new