Show More
@@ -28,6 +28,7 b' Authors' | |||||
28 | from __future__ import print_function |
|
28 | from __future__ import print_function | |
29 |
|
29 | |||
30 | # Stdlib imports |
|
30 | # Stdlib imports | |
|
31 | from ast import PyCF_ONLY_AST | |||
31 | import codeop |
|
32 | import codeop | |
32 | import hashlib |
|
33 | import hashlib | |
33 | import linecache |
|
34 | import linecache | |
@@ -77,6 +78,16 b' class CachingCompiler(codeop.Compile):' | |||||
77 | # stdlib that call it outside our control go through our codepath |
|
78 | # stdlib that call it outside our control go through our codepath | |
78 | # (otherwise we'd lose our tracebacks). |
|
79 | # (otherwise we'd lose our tracebacks). | |
79 | linecache.checkcache = self.check_cache |
|
80 | linecache.checkcache = self.check_cache | |
|
81 | ||||
|
82 | def ast_parse(self, source, filename='<unknown>', symbol='exec'): | |||
|
83 | """Parse code to an AST with the current compiler flags active.""" | |||
|
84 | return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1) | |||
|
85 | ||||
|
86 | def reset_compiler_flags(self): | |||
|
87 | """Reset compiler flags to default state.""" | |||
|
88 | # This value is copied from codeop.Compile.__init__, so if that ever | |||
|
89 | # changes, it will need to be updated. | |||
|
90 | self.flags = codeop.PyCF_DONT_IMPLY_DEDENT | |||
80 |
|
91 | |||
81 | @property |
|
92 | @property | |
82 | def compiler_flags(self): |
|
93 | def compiler_flags(self): |
@@ -2281,7 +2281,7 b' class InteractiveShell(SingletonConfigurable, Magic):' | |||||
2281 |
|
2281 | |||
2282 | with self.display_trap: |
|
2282 | with self.display_trap: | |
2283 | try: |
|
2283 | try: | |
2284 |
code_ast = |
|
2284 | code_ast = self.compile.ast_parse(cell, filename=cell_name) | |
2285 | except IndentationError: |
|
2285 | except IndentationError: | |
2286 | self.showindentationerror() |
|
2286 | self.showindentationerror() | |
2287 | self.execution_count += 1 |
|
2287 | self.execution_count += 1 |
@@ -122,3 +122,14 b' class InteractiveShellTestCase(unittest.TestCase):' | |||||
122 | import IPython.core.formatters |
|
122 | import IPython.core.formatters | |
123 | f = IPython.core.formatters.PlainTextFormatter() |
|
123 | f = IPython.core.formatters.PlainTextFormatter() | |
124 | f([Spam(),Spam()]) |
|
124 | f([Spam(),Spam()]) | |
|
125 | ||||
|
126 | def test_future_flags(self): | |||
|
127 | """Check that future flags are used for parsing code (gh-777)""" | |||
|
128 | ip = get_ipython() | |||
|
129 | ip.run_cell('from __future__ import print_function') | |||
|
130 | try: | |||
|
131 | ip.run_cell('prfunc_return_val = print(1,2, sep=" ")') | |||
|
132 | assert 'prfunc_return_val' in ip.user_ns | |||
|
133 | finally: | |||
|
134 | # Reset compiler flags so we don't mess up other tests. | |||
|
135 | ip.compile.reset_compiler_flags() |
General Comments 0
You need to be logged in to leave comments.
Login now