Mercurial > cpython-lru_cache-weakref
view Lib/test/test_codeop.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 | fdf907708f49 |
| children |
line wrap: on
line source
""" Test cases for codeop.py Nick Mathewson """ import unittest from test.support import run_unittest, is_jython from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT import io if is_jython: import sys def unify_callables(d): for n,v in d.items(): if hasattr(v, '__call__'): d[n] = True return d class CodeopTests(unittest.TestCase): def assertValid(self, str, symbol='single'): '''succeed iff str is a valid piece of code''' if is_jython: code = compile_command(str, "<input>", symbol) self.assertTrue(code) if symbol == "single": d,r = {},{} saved_stdout = sys.stdout sys.stdout = io.StringIO() try: exec(code, d) exec(compile(str,"<input>","single"), r) finally: sys.stdout = saved_stdout elif symbol == 'eval': ctx = {'a': 2} d = { 'value': eval(code,ctx) } r = { 'value': eval(str,ctx) } self.assertEqual(unify_callables(r),unify_callables(d)) else: expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT) self.assertEqual(compile_command(str, "<input>", symbol), expected) def assertIncomplete(self, str, symbol='single'): '''succeed iff str is the start of a valid piece of code''' self.assertEqual(compile_command(str, symbol=symbol), None) def assertInvalid(self, str, symbol='single', is_syntax=1): '''succeed iff str is the start of an invalid piece of code''' try: compile_command(str,symbol=symbol) self.fail("No exception raised for invalid code") except SyntaxError: self.assertTrue(is_syntax) except OverflowError: self.assertTrue(not is_syntax) def test_valid(self): av = self.assertValid # special case if not is_jython: self.assertEqual(compile_command(""), compile("pass", "<input>", 'single', PyCF_DONT_IMPLY_DEDENT)) self.assertEqual(compile_command("\n"), compile("pass", "<input>", 'single', PyCF_DONT_IMPLY_DEDENT)) else: av("") av("\n") av("a = 1") av("\na = 1") av("a = 1\n") av("a = 1\n\n") av("\n\na = 1\n\n") av("def x():\n pass\n") av("if 1:\n pass\n") av("\n\nif 1: pass\n") av("\n\nif 1: pass\n\n") av("def x():\n\n pass\n") av("def x():\n pass\n \n") av("def x():\n pass\n \n") av("pass\n") av("3**3\n") av("if 9==3:\n pass\nelse:\n pass\n") av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") av("#a\n#b\na = 3\n") av("#a\n\n \na=3\n") av("a=3\n\n") av("a = 9+ \\\n3") av("3**3","eval") av("(lambda z: \n z**3)","eval") av("9+ \\\n3","eval") av("9+ \\\n3\n","eval") av("\n\na**3","eval") av("\n \na**3","eval") av("#a\n#b\na**3","eval") av("\n\na = 1\n\n") av("\n\nif 1: a=1\n\n") av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") av("#a\n\n \na=3\n\n") av("\n\na**3","eval") av("\n \na**3","eval") av("#a\n#b\na**3","eval") av("def f():\n try: pass\n finally: [x for x in (1,2)]\n") av("def f():\n pass\n#foo\n") av("@a.b.c\ndef f():\n pass\n") def test_incomplete(self): ai = self.assertIncomplete ai("(a **") ai("(a,b,") ai("(a,b,(") ai("(a,b,(") ai("a = (") ai("a = {") ai("b + {") ai("if 9==3:\n pass\nelse:") ai("if 9==3:\n pass\nelse:\n") ai("if 9==3:\n pass\nelse:\n pass") ai("if 1:") ai("if 1:\n") ai("if 1:\n pass\n if 1:\n pass\n else:") ai("if 1:\n pass\n if 1:\n pass\n else:\n") ai("if 1:\n pass\n if 1:\n pass\n else:\n pass") ai("def x():") ai("def x():\n") ai("def x():\n\n") ai("def x():\n pass") ai("def x():\n pass\n ") ai("def x():\n pass\n ") ai("\n\ndef x():\n pass") ai("a = 9+ \\") ai("a = 'a\\") ai("a = '''xy") ai("","eval") ai("\n","eval") ai("(","eval") ai("(\n\n\n","eval") ai("(9+","eval") ai("9+ \\","eval") ai("lambda z: \\","eval") ai("if True:\n if True:\n if True: \n") ai("@a(") ai("@a(b") ai("@a(b,") ai("@a(b,c") ai("@a(b,c,") ai("from a import (") ai("from a import (b") ai("from a import (b,") ai("from a import (b,c") ai("from a import (b,c,") ai("["); ai("[a"); ai("[a,"); ai("[a,b"); ai("[a,b,"); ai("{"); ai("{a"); ai("{a:"); ai("{a:b"); ai("{a:b,"); ai("{a:b,c"); ai("{a:b,c:"); ai("{a:b,c:d"); ai("{a:b,c:d,"); ai("a(") ai("a(b") ai("a(b,") ai("a(b,c") ai("a(b,c,") ai("a[") ai("a[b") ai("a[b,") ai("a[b:") ai("a[b:c") ai("a[b:c:") ai("a[b:c:d") ai("def a(") ai("def a(b") ai("def a(b,") ai("def a(b,c") ai("def a(b,c,") ai("(") ai("(a") ai("(a,") ai("(a,b") ai("(a,b,") ai("if a:\n pass\nelif b:") ai("if a:\n pass\nelif b:\n pass\nelse:") ai("while a:") ai("while a:\n pass\nelse:") ai("for a in b:") ai("for a in b:\n pass\nelse:") ai("try:") ai("try:\n pass\nexcept:") ai("try:\n pass\nfinally:") ai("try:\n pass\nexcept:\n pass\nfinally:") ai("with a:") ai("with a as b:") ai("class a:") ai("class a(") ai("class a(b") ai("class a(b,") ai("class a():") ai("[x for") ai("[x for x in") ai("[x for x in (") ai("(x for") ai("(x for x in") ai("(x for x in (") def test_invalid(self): ai = self.assertInvalid ai("a b") ai("a @") ai("a b @") ai("a ** @") ai("a = ") ai("a = 9 +") ai("def x():\n\npass\n") ai("\n\n if 1: pass\n\npass") ai("a = 9+ \\\n") ai("a = 'a\\ ") ai("a = 'a\\\n") ai("a = 1","eval") ai("a = (","eval") ai("]","eval") ai("())","eval") ai("[}","eval") ai("9+","eval") ai("lambda z:","eval") ai("a b","eval") ai("return 2.3") ai("if (a == 1 and b = 2): pass") ai("del 1") ai("del ()") ai("del (1,)") ai("del [1]") ai("del '1'") ai("[i for i in range(10)] = (1, 2, 3)") def test_filename(self): self.assertEqual(compile_command("a = 1\n", "abc").co_filename, compile("a = 1\n", "abc", 'single').co_filename) self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename, compile("a = 1\n", "def", 'single').co_filename) def test_main(): run_unittest(CodeopTests) if __name__ == "__main__": test_main()
