Mercurial > cpython-lru_cache-weakref
annotate Lib/test/test_dynamic.py @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | aa632943b8bd |
| children |
| rev | line source |
|---|---|
|
59654
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
1 # Test the most dynamic corner cases of Python's runtime semantics. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
2 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
3 import builtins |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
4 import contextlib |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
5 import unittest |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
6 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
7 from test.support import run_unittest, swap_item, swap_attr |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
8 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
9 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
10 class RebindBuiltinsTests(unittest.TestCase): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
11 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
12 """Test all the ways that we can change/shadow globals/builtins.""" |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
13 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
14 def configure_func(self, func, *args): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
15 """Perform TestCase-specific configuration on a function before testing. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
16 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
17 By default, this does nothing. Example usage: spinning a function so |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
18 that a JIT will optimize it. Subclasses should override this as needed. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
19 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
20 Args: |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
21 func: function to configure. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
22 *args: any arguments that should be passed to func, if calling it. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
23 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
24 Returns: |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
25 Nothing. Work will be performed on func in-place. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
26 """ |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
27 pass |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
28 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
29 def test_globals_shadow_builtins(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
30 # Modify globals() to shadow an entry in builtins. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
31 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
32 return len([1, 2, 3]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
33 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
34 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
35 self.assertEqual(foo(), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
36 with swap_item(globals(), "len", lambda x: 7): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
37 self.assertEqual(foo(), 7) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
38 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
39 def test_modify_builtins(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
40 # Modify the builtins module directly. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
41 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
42 return len([1, 2, 3]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
43 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
44 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
45 self.assertEqual(foo(), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
46 with swap_attr(builtins, "len", lambda x: 7): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
47 self.assertEqual(foo(), 7) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
48 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
49 def test_modify_builtins_while_generator_active(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
50 # Modify the builtins out from under a live generator. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
51 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
52 x = range(3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
53 yield len(x) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
54 yield len(x) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
55 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
56 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
57 g = foo() |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
58 self.assertEqual(next(g), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
59 with swap_attr(builtins, "len", lambda x: 7): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
60 self.assertEqual(next(g), 7) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
61 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
62 def test_modify_builtins_from_leaf_function(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
63 # Verify that modifications made by leaf functions percolate up the |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
64 # callstack. |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
65 with swap_attr(builtins, "len", len): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
66 def bar(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
67 builtins.len = lambda x: 4 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
68 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
69 def foo(modifier): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
70 l = [] |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
71 l.append(len(range(7))) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
72 modifier() |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
73 l.append(len(range(7))) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
74 return l |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
75 self.configure_func(foo, lambda: None) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
76 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
77 self.assertEqual(foo(bar), [7, 4]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
78 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
79 def test_cannot_change_globals_or_builtins_with_eval(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
80 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
81 return len([1, 2, 3]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
82 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
83 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
84 # Note that this *doesn't* change the definition of len() seen by foo(). |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
85 builtins_dict = {"len": lambda x: 7} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
86 globals_dict = {"foo": foo, "__builtins__": builtins_dict, |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
87 "len": lambda x: 8} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
88 self.assertEqual(eval("foo()", globals_dict), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
89 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
90 self.assertEqual(eval("foo()", {"foo": foo}), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
91 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
92 def test_cannot_change_globals_or_builtins_with_exec(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
93 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
94 return len([1, 2, 3]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
95 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
96 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
97 globals_dict = {"foo": foo} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
98 exec("x = foo()", globals_dict) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
99 self.assertEqual(globals_dict["x"], 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
100 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
101 # Note that this *doesn't* change the definition of len() seen by foo(). |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
102 builtins_dict = {"len": lambda x: 7} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
103 globals_dict = {"foo": foo, "__builtins__": builtins_dict, |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
104 "len": lambda x: 8} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
105 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
106 exec("x = foo()", globals_dict) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
107 self.assertEqual(globals_dict["x"], 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
108 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
109 def test_cannot_replace_builtins_dict_while_active(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
110 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
111 x = range(3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
112 yield len(x) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
113 yield len(x) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
114 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
115 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
116 g = foo() |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
117 self.assertEqual(next(g), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
118 with swap_item(globals(), "__builtins__", {"len": lambda x: 7}): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
119 self.assertEqual(next(g), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
120 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
121 def test_cannot_replace_builtins_dict_between_calls(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
122 def foo(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
123 return len([1, 2, 3]) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
124 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
125 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
126 self.assertEqual(foo(), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
127 with swap_item(globals(), "__builtins__", {"len": lambda x: 7}): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
128 self.assertEqual(foo(), 3) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
129 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
130 def test_eval_gives_lambda_custom_globals(self): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
131 globals_dict = {"len": lambda x: 7} |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
132 foo = eval("lambda: len([])", globals_dict) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
133 self.configure_func(foo) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
134 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
135 self.assertEqual(foo(), 7) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
136 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
137 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
138 def test_main(): |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
139 run_unittest(RebindBuiltinsTests) |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
140 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
141 |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
142 if __name__ == "__main__": |
|
aa632943b8bd
Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents:
diff
changeset
|
143 test_main() |
