Show More
@@ -76,6 +76,9 b' class DisplayHook(Configurable):' | |||
|
76 | 76 | # particular uses _, so we need to stay away from it. |
|
77 | 77 | if '_' in builtin_mod.__dict__: |
|
78 | 78 | try: |
|
79 | user_value = self.shell.user_ns['_'] | |
|
80 | if user_value is not self._: | |
|
81 | return | |
|
79 | 82 | del self.shell.user_ns['_'] |
|
80 | 83 | except KeyError: |
|
81 | 84 | pass |
@@ -195,13 +198,23 b' class DisplayHook(Configurable):' | |||
|
195 | 198 | if result is not self.shell.user_ns['_oh']: |
|
196 | 199 | if len(self.shell.user_ns['_oh']) >= self.cache_size and self.do_full_cache: |
|
197 | 200 | self.cull_cache() |
|
198 | # Don't overwrite '_' and friends if '_' is in __builtin__ (otherwise | |
|
199 | # we cause buggy behavior for things like gettext). | |
|
200 | 201 | |
|
201 | if '_' not in builtin_mod.__dict__: | |
|
202 | self.___ = self.__ | |
|
203 | self.__ = self._ | |
|
204 |
|
|
|
202 | # Don't overwrite '_' and friends if '_' is in __builtin__ | |
|
203 | # (otherwise we cause buggy behavior for things like gettext). and | |
|
204 | # do not overwrite _, __ or ___ if one of these has been assigned | |
|
205 | # by the user. | |
|
206 | update_unders = True | |
|
207 | for unders in ['_'*i for i in range(1,4)]: | |
|
208 | if not unders in self.shell.user_ns: | |
|
209 | continue | |
|
210 | if getattr(self, unders) is not self.shell.user_ns.get(unders): | |
|
211 | update_unders = False | |
|
212 | ||
|
213 | self.___ = self.__ | |
|
214 | self.__ = self._ | |
|
215 | self._ = result | |
|
216 | ||
|
217 | if ('_' not in builtin_mod.__dict__) and (update_unders): | |
|
205 | 218 | self.shell.push({'_':self._, |
|
206 | 219 | '__':self.__, |
|
207 | 220 | '___':self.___}, interactive=False) |
@@ -209,7 +222,7 b' class DisplayHook(Configurable):' | |||
|
209 | 222 | # hackish access to top-level namespace to create _1,_2... dynamically |
|
210 | 223 | to_main = {} |
|
211 | 224 | if self.do_full_cache: |
|
212 |
new_result = '_' |
|
|
225 | new_result = '_%s' % self.prompt_count | |
|
213 | 226 | to_main[new_result] = result |
|
214 | 227 | self.shell.push(to_main, interactive=False) |
|
215 | 228 | self.shell.user_ns['_oh'][self.prompt_count] = result |
@@ -26,3 +26,30 b' def test_output_quiet():' | |||
|
26 | 26 | |
|
27 | 27 | with AssertNotPrints('2'): |
|
28 | 28 | ip.run_cell('1+1;\n#commented_out_function()', store_history=True) |
|
29 | ||
|
30 | def test_underscore_no_overrite_user(): | |
|
31 | ip.run_cell('_ = 42', store_history=True) | |
|
32 | ip.run_cell('1+1', store_history=True) | |
|
33 | ||
|
34 | with AssertPrints('42'): | |
|
35 | ip.run_cell('print(_)', store_history=True) | |
|
36 | ||
|
37 | ip.run_cell('del _', store_history=True) | |
|
38 | ip.run_cell('6+6', store_history=True) | |
|
39 | with AssertPrints('12'): | |
|
40 | ip.run_cell('_', store_history=True) | |
|
41 | ||
|
42 | ||
|
43 | def test_underscore_no_overrite_builtins(): | |
|
44 | ip.run_cell("import gettext ; gettext.install('foo')", store_history=True) | |
|
45 | ip.run_cell('3+3', store_history=True) | |
|
46 | ||
|
47 | with AssertPrints('gettext'): | |
|
48 | ip.run_cell('print(_)', store_history=True) | |
|
49 | ||
|
50 | ip.run_cell('_ = "userset"', store_history=True) | |
|
51 | ||
|
52 | with AssertPrints('userset'): | |
|
53 | ip.run_cell('print(_)', store_history=True) | |
|
54 | ip.run_cell('import builtins; del builtins._') | |
|
55 |
General Comments 0
You need to be logged in to leave comments.
Login now