mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-34983: Expose symtable.Symbol.is_nonlocal() in the symtable module (GH-9872)
The symbol table was not exposing functionality to query the nonlocal symbols in a function or to check if a particular symbol is nonlocal.
This commit is contained in:
parent
6395844e6a
commit
d5b4f1b5a0
5 changed files with 36 additions and 3 deletions
|
@ -10,6 +10,7 @@ TEST_CODE = """
|
|||
import sys
|
||||
|
||||
glob = 42
|
||||
some_var = 12
|
||||
|
||||
class Mine:
|
||||
instance_var = 24
|
||||
|
@ -19,10 +20,15 @@ class Mine:
|
|||
def spam(a, b, *var, **kw):
|
||||
global bar
|
||||
bar = 47
|
||||
some_var = 10
|
||||
x = 23
|
||||
glob
|
||||
def internal():
|
||||
return x
|
||||
def other_internal():
|
||||
nonlocal some_var
|
||||
some_var = 3
|
||||
return some_var
|
||||
return internal
|
||||
|
||||
def foo():
|
||||
|
@ -47,6 +53,7 @@ class SymtableTest(unittest.TestCase):
|
|||
a_method = find_block(Mine, "a_method")
|
||||
spam = find_block(top, "spam")
|
||||
internal = find_block(spam, "internal")
|
||||
other_internal = find_block(spam, "other_internal")
|
||||
foo = find_block(top, "foo")
|
||||
|
||||
def test_type(self):
|
||||
|
@ -75,12 +82,12 @@ class SymtableTest(unittest.TestCase):
|
|||
|
||||
def test_lineno(self):
|
||||
self.assertEqual(self.top.get_lineno(), 0)
|
||||
self.assertEqual(self.spam.get_lineno(), 11)
|
||||
self.assertEqual(self.spam.get_lineno(), 12)
|
||||
|
||||
def test_function_info(self):
|
||||
func = self.spam
|
||||
self.assertEqual(sorted(func.get_parameters()), ["a", "b", "kw", "var"])
|
||||
expected = ["a", "b", "internal", "kw", "var", "x"]
|
||||
expected = ['a', 'b', 'internal', 'kw', 'other_internal', 'some_var', 'var', 'x']
|
||||
self.assertEqual(sorted(func.get_locals()), expected)
|
||||
self.assertEqual(sorted(func.get_globals()), ["bar", "glob"])
|
||||
self.assertEqual(self.internal.get_frees(), ("x",))
|
||||
|
@ -93,6 +100,12 @@ class SymtableTest(unittest.TestCase):
|
|||
self.assertFalse(self.internal.lookup("x").is_global())
|
||||
self.assertFalse(self.Mine.lookup("instance_var").is_global())
|
||||
|
||||
def test_nonlocal(self):
|
||||
self.assertFalse(self.spam.lookup("some_var").is_nonlocal())
|
||||
self.assertTrue(self.other_internal.lookup("some_var").is_nonlocal())
|
||||
expected = ("some_var",)
|
||||
self.assertEqual(self.other_internal.get_nonlocals(), expected)
|
||||
|
||||
def test_local(self):
|
||||
self.assertTrue(self.spam.lookup("x").is_local())
|
||||
self.assertFalse(self.internal.lookup("x").is_local())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue