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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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