diff -r ef63e1c999bd Doc/reference/simple_stmts.rst --- a/Doc/reference/simple_stmts.rst Sun Sep 11 11:23:38 2016 +0300 +++ b/Doc/reference/simple_stmts.rst Sun Sep 11 12:23:52 2016 +0200 @@ -334,9 +334,10 @@ For simple names as assignment targets, if in class or module scope, the annotations are evaluated and stored in a special class or module attribute :attr:`__annotations__` -that is a dictionary mapping from variable names to evaluated annotations. -This attribute is writable and is automatically created at the start -of class or module body execution, if annotations are found statically. +that is a dictionary mapping from variable names (mangled if private) to +evaluated annotations. This attribute is writable and is automatically +created at the start of class or module body execution, if annotations +are found statically. For expressions as assignment targets, the annotations are evaluated if in class or module scope, but not stored. diff -r ef63e1c999bd Lib/test/test_grammar.py --- a/Lib/test/test_grammar.py Sun Sep 11 11:23:38 2016 +0300 +++ b/Lib/test/test_grammar.py Sun Sep 11 12:23:52 2016 +0200 @@ -328,12 +328,12 @@ # class semantics class C: - x: int + __foo: int s: str = "attr" z = 2 def __init__(self, x): self.x: int = x - self.assertEqual(C.__annotations__, {'x': int, 's': str}) + self.assertEqual(C.__annotations__, {'_C__foo': int, 's': str}) with self.assertRaises(NameError): class CBad: no_such_name_defined.attr: int = 0 diff -r ef63e1c999bd Python/compile.c --- a/Python/compile.c Sun Sep 11 11:23:38 2016 +0300 +++ b/Python/compile.c Sun Sep 11 12:23:52 2016 +0200 @@ -4562,6 +4562,7 @@ compiler_annassign(struct compiler *c, stmt_ty s) { expr_ty targ = s->v.AnnAssign.target; + PyObject* mangled; assert(s->kind == AnnAssign_kind); @@ -4576,8 +4577,13 @@ if (s->v.AnnAssign.simple && (c->u->u_scope_type == COMPILER_SCOPE_MODULE || c->u->u_scope_type == COMPILER_SCOPE_CLASS)) { + mangled = _Py_Mangle(c->u->u_private, targ->v.Name.id); + if (!mangled) { + return 0; + } VISIT(c, expr, s->v.AnnAssign.annotation); - ADDOP_O(c, STORE_ANNOTATION, targ->v.Name.id, names) + /* ADDOP_N decrefs its argument */ + ADDOP_N(c, STORE_ANNOTATION, mangled, names); } break; case Attribute_kind: