]> granicus.if.org Git - python/commitdiff
Issue #28076: Variable annotations should be mangled for private names.
authorGuido van Rossum <guido@dropbox.com>
Sun, 11 Sep 2016 16:45:24 +0000 (09:45 -0700)
committerGuido van Rossum <guido@dropbox.com>
Sun, 11 Sep 2016 16:45:24 +0000 (09:45 -0700)
By Ivan Levkivskyi.

Doc/reference/simple_stmts.rst
Lib/test/test_grammar.py
Python/compile.c

index 6aafa7258f1690f731550fa02bd29e9eded617e9..3dc4418f97e58a7d7b6d921570995e1a3658c09e 100644 (file)
@@ -334,9 +334,10 @@ only single right hand side value is allowed.
 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.
index 914aa679441419863b205bd629f3286cb27daa03..67a61d4ab5b65edb0277744f4a5b6547a94fa20d 100644 (file)
@@ -328,12 +328,12 @@ class GrammarTests(unittest.TestCase):
 
         # 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
index 6d64c076e10a33872cd49d3fb88b3d0eb50556a0..6bab86eb0ba09a0d10bed51e1a91a8278ffbf4c4 100644 (file)
@@ -4562,6 +4562,7 @@ static int
 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 @@ compiler_annassign(struct compiler *c, stmt_ty s)
         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: