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.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):
|
||||
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);
|
||||
}
|
||||
if ((cur & (DEF_GLOBAL | DEF_NONLOCAL))
|
||||
&& (st->st_cur->ste_symbols != st->st_global)
|
||||
&& s->v.AnnAssign.simple) {
|
||||
PyErr_Format(PyExc_SyntaxError,
|
||||
cur & DEF_GLOBAL ? GLOBAL_ANNOT : NONLOCAL_ANNOT,
|
||||
|
|
Loading…
Reference in New Issue