mirror of https://github.com/python/cpython
bpo-34939: Allow annotated global names in module namespace (GH-9844)
Allow annotated global names in the module namespace after the symbol is declared as global. Previously, only symbols annotated before they are declared as global (i.e. inside a function) were allowed. This change allows symbols to be declared as global before the annotation happens in the global scope.
This commit is contained in:
parent
bd036d3d15
commit
de2aea0ff0
|
@ -144,6 +144,20 @@ class SymtableTest(unittest.TestCase):
|
||||||
self.assertTrue(st4.lookup('x').is_local())
|
self.assertTrue(st4.lookup('x').is_local())
|
||||||
self.assertFalse(st4.lookup('x').is_annotated())
|
self.assertFalse(st4.lookup('x').is_annotated())
|
||||||
|
|
||||||
|
# Test that annotations in the global scope are valid after the
|
||||||
|
# variable is declared as nonlocal.
|
||||||
|
st5 = symtable.symtable('global x\nx: int', 'test', 'exec')
|
||||||
|
self.assertTrue(st5.lookup("x").is_global())
|
||||||
|
|
||||||
|
# Test that annotations for nonlocals are valid after the
|
||||||
|
# variable is declared as nonlocal.
|
||||||
|
st6 = symtable.symtable('def g():\n'
|
||||||
|
' x = 2\n'
|
||||||
|
' def f():\n'
|
||||||
|
' nonlocal x\n'
|
||||||
|
' x: int',
|
||||||
|
'test', 'exec')
|
||||||
|
|
||||||
def test_imported(self):
|
def test_imported(self):
|
||||||
self.assertTrue(self.top.lookup("sys").is_imported())
|
self.assertTrue(self.top.lookup("sys").is_imported())
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Allow annotated names in module namespace that are declared global before
|
||||||
|
the annotation happens. Patch by Pablo Galindo.
|
|
@ -1175,6 +1175,7 @@ symtable_visit_stmt(struct symtable *st, stmt_ty s)
|
||||||
VISIT_QUIT(st, 0);
|
VISIT_QUIT(st, 0);
|
||||||
}
|
}
|
||||||
if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
|
if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
|
||||||
|
&& (st->st_cur->ste_symbols != st->st_global)
|
||||||
&& s->v.AnnAssign.simple) {
|
&& s->v.AnnAssign.simple) {
|
||||||
PyErr_Format(PyExc_SyntaxError,
|
PyErr_Format(PyExc_SyntaxError,
|
||||||
cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
|
cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
|
||||||
|
|
Loading…
Reference in New Issue