Mercurial > cpython-lru_cache-weakref
annotate Lib/lib2to3/fixes/fix_except.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 |
| rev | line source |
|---|---|
| 45906 | 1 """Fixer for except statements with named exceptions. |
| 2 | |
| 3 The following cases will be converted: | |
| 4 | |
| 5 - "except E, T:" where T is a name: | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
6 |
| 45906 | 7 except E as T: |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
8 |
| 45906 | 9 - "except E, T:" where T is not a name, tuple or list: |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
10 |
| 45906 | 11 except E as t: |
| 12 T = t | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
13 |
| 45906 | 14 This is done because the target of an "except" clause must be a |
| 15 name. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
16 |
| 45906 | 17 - "except E, T:" where T is a tuple or list literal: |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
18 |
| 45906 | 19 except E as t: |
| 20 T = t.args | |
| 21 """ | |
| 22 # Author: Collin Winter | |
| 23 | |
| 24 # Local imports | |
| 25 from .. import pytree | |
| 26 from ..pgen2 import token | |
|
47726
4e304aded7a8
Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
46153
diff
changeset
|
27 from .. import fixer_base |
|
53823
a2303a74a761
Merged revisions 72368 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49884
diff
changeset
|
28 from ..fixer_util import Assign, Attr, Name, is_tuple, is_list, syms |
| 45906 | 29 |
| 30 def find_excepts(nodes): | |
| 31 for i, n in enumerate(nodes): | |
|
53823
a2303a74a761
Merged revisions 72368 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49884
diff
changeset
|
32 if n.type == syms.except_clause: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
33 if n.children[0].value == u'except': |
| 45906 | 34 yield (n, nodes[i+2]) |
| 35 | |
|
47726
4e304aded7a8
Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
46153
diff
changeset
|
36 class FixExcept(fixer_base.BaseFix): |
| 45906 | 37 |
| 38 PATTERN = """ | |
| 39 try_stmt< 'try' ':' suite | |
|
46153
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
40 cleanup=(except_clause ':' suite)+ |
|
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
41 tail=(['except' ':' suite] |
|
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
42 ['else' ':' suite] |
|
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
43 ['finally' ':' suite]) > |
| 45906 | 44 """ |
| 45 | |
| 46 def transform(self, node, results): | |
| 47 syms = self.syms | |
| 48 | |
|
46153
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
49 tail = [n.clone() for n in results["tail"]] |
|
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
50 |
|
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
51 try_cleanup = [ch.clone() for ch in results["cleanup"]] |
| 45906 | 52 for except_clause, e_suite in find_excepts(try_cleanup): |
| 53 if len(except_clause.children) == 4: | |
| 54 (E, comma, N) = except_clause.children[1:4] | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
55 comma.replace(Name(u"as", prefix=u" ")) |
| 45906 | 56 |
| 57 if N.type != token.NAME: | |
| 58 # Generate a new N for the except clause | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
59 new_N = Name(self.new_name(), prefix=u" ") |
| 45906 | 60 target = N.clone() |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
61 target.set_prefix(u"") |
| 45906 | 62 N.replace(new_N) |
| 63 new_N = new_N.clone() | |
| 64 | |
| 65 # Insert "old_N = new_N" as the first statement in | |
| 66 # the except body. This loop skips leading whitespace | |
| 67 # and indents | |
| 68 #TODO(cwinter) suite-cleanup | |
| 69 suite_stmts = e_suite.children | |
| 70 for i, stmt in enumerate(suite_stmts): | |
| 71 if isinstance(stmt, pytree.Node): | |
| 72 break | |
| 73 | |
| 74 # The assignment is different if old_N is a tuple or list | |
| 75 # In that case, the assignment is old_N = new_N.args | |
| 76 if is_tuple(N) or is_list(N): | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
77 assign = Assign(target, Attr(new_N, Name(u'args'))) |
| 45906 | 78 else: |
| 79 assign = Assign(target, new_N) | |
| 80 | |
| 81 #TODO(cwinter) stopgap until children becomes a smart list | |
| 82 for child in reversed(suite_stmts[:i]): | |
| 83 e_suite.insert_child(0, child) | |
| 84 e_suite.insert_child(i, assign) | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
85 elif N.get_prefix() == u"": |
| 45906 | 86 # No space after a comma is legal; no space after "as", |
| 87 # not so much. | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53823
diff
changeset
|
88 N.set_prefix(u" ") |
| 45906 | 89 |
| 90 #TODO(cwinter) fix this when children becomes a smart list | |
|
46153
7232259a0529
Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
91 children = [c.clone() for c in node.children[:3]] + try_cleanup + tail |
| 45906 | 92 return pytree.Node(node.type, children) |
