Mercurial > cpython-lru_cache-weakref
annotate Lib/compiler/future.py @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | b350960ade6d |
| children |
| rev | line source |
|---|---|
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
1 """Parser for future statements |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
2 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
3 """ |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
4 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
5 from compiler import ast, walk |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
6 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
7 def is_future(stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
8 """Return true if statement is a well-formed future statement""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
9 if not isinstance(stmt, ast.From): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
10 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
11 if stmt.modname == "__future__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
12 return 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
13 else: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
14 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
15 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
16 class FutureParser: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
17 |
|
36726
bbf16fd024df
from __future__ import with_statement addon for 'with', mostly written by
Thomas Wouters <thomas@python.org>
parents:
36690
diff
changeset
|
18 features = ("nested_scopes", "generators", "division", |
|
46133
b350960ade6d
Fix test_compiler after adding unicode_literals
Neal Norwitz <nnorwitz@gmail.com>
parents:
45897
diff
changeset
|
19 "absolute_import", "with_statement", "print_function", |
|
b350960ade6d
Fix test_compiler after adding unicode_literals
Neal Norwitz <nnorwitz@gmail.com>
parents:
45897
diff
changeset
|
20 "unicode_literals") |
|
20547
a12ccdbce8da
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
19361
diff
changeset
|
21 |
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
22 def __init__(self): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
23 self.found = {} # set |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
24 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
25 def visitModule(self, node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
26 stmt = node.node |
|
19361
9222b6e3b368
Track removal of doc string from Module().nodes[0]
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
17346
diff
changeset
|
27 for s in stmt.nodes: |
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
28 if not self.check_stmt(s): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
29 break |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
30 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
31 def check_stmt(self, stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
32 if is_future(stmt): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
33 for name, asname in stmt.names: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
34 if name in self.features: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
35 self.found[name] = 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
36 else: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
37 raise SyntaxError, \ |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
38 "future feature %s is not defined" % name |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
39 stmt.valid_future = 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
40 return 1 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
41 return 0 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
42 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
43 def get_features(self): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
44 """Return list of features enabled by future statements""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
45 return self.found.keys() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
46 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
47 class BadFutureParser: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
48 """Check for invalid future statements""" |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
49 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
50 def visitFrom(self, node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
51 if hasattr(node, 'valid_future'): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
52 return |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
53 if node.modname != "__future__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
54 return |
|
36690
acaa79e73133
Skip over doc strings.
Martin v. Löwis <martin@v.loewis.de>
parents:
20547
diff
changeset
|
55 raise SyntaxError, "invalid future statement " + repr(node) |
|
17346
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
56 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
57 def find_futures(node): |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
58 p1 = FutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
59 p2 = BadFutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
60 walk(node, p1) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
61 walk(node, p2) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
62 return p1.get_features() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
63 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
64 if __name__ == "__main__": |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
65 import sys |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
66 from compiler import parseFile, walk |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
67 |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
68 for file in sys.argv[1:]: |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
69 print file |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
70 tree = parseFile(file) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
71 v = FutureParser() |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
72 walk(tree, v) |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
73 print v.found |
|
f8fdbeb73667
Add support for future statements
Jeremy Hylton <jeremy@alum.mit.edu>
parents:
diff
changeset
|
74 print |
