summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2013-05-15 20:26:42 (GMT)
committerBenjamin Peterson <benjamin@python.org>2013-05-15 20:26:42 (GMT)
commit312595ce3a75e91d53222e486dfdd6f3668422ca (patch)
tree6128e0533586fff8500ef53ed91232a43af8b7dc /Lib
parentfe361dfab588b75b9714b31648b98b982e6d1eda (diff)
downloadcpython-312595ce3a75e91d53222e486dfdd6f3668422ca.zip
cpython-312595ce3a75e91d53222e486dfdd6f3668422ca.tar.gz
cpython-312595ce3a75e91d53222e486dfdd6f3668422ca.tar.bz2
hide the __class__ closure from the class body (#12370)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/importlib/_bootstrap.py3
-rw-r--r--Lib/test/test_super.py28
2 files changed, 28 insertions, 3 deletions
diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py
index 155403e..e791983 100644
--- a/Lib/importlib/_bootstrap.py
+++ b/Lib/importlib/_bootstrap.py
@@ -390,12 +390,13 @@ def _call_with_frames_removed(f, *args, **kwds):
# keyword-only defaults)
# Python 3.4a1 3260 (add LOAD_CLASSDEREF; allow locals of class to override
# free vars)
+# Python 3.4a1 3270 (various tweaks to the __class_ closure)
#
# MAGIC must change whenever the bytecode emitted by the compiler may no
# longer be understood by older implementations of the eval loop (usually
# due to the addition of new opcodes).
-_MAGIC_BYTES = (3260).to_bytes(2, 'little') + b'\r\n'
+_MAGIC_BYTES = (3270).to_bytes(2, 'little') + b'\r\n'
_RAW_MAGIC_NUMBER = int.from_bytes(_MAGIC_BYTES, 'little')
_PYCACHE = '__pycache__'
diff --git a/Lib/test/test_super.py b/Lib/test/test_super.py
index 1e272ee..d0ce40a 100644
--- a/Lib/test/test_super.py
+++ b/Lib/test/test_super.py
@@ -81,8 +81,7 @@ class TestSuper(unittest.TestCase):
self.assertEqual(E().f(), 'AE')
- @unittest.expectedFailure
- def test___class___set(self):
+ def test_various___class___pathologies(self):
# See issue #12370
class X(A):
def f(self):
@@ -91,6 +90,31 @@ class TestSuper(unittest.TestCase):
x = X()
self.assertEqual(x.f(), 'A')
self.assertEqual(x.__class__, 413)
+ class X:
+ x = __class__
+ def f():
+ __class__
+ self.assertIs(X.x, type(self))
+ with self.assertRaises(NameError) as e:
+ exec("""class X:
+ __class__
+ def f():
+ __class__""", globals(), {})
+ self.assertIs(type(e.exception), NameError) # Not UnboundLocalError
+ class X:
+ global __class__
+ __class__ = 42
+ def f():
+ __class__
+ self.assertEqual(globals()["__class__"], 42)
+ del globals()["__class__"]
+ self.assertNotIn("__class__", X.__dict__)
+ class X:
+ nonlocal __class__
+ __class__ = 42
+ def f():
+ __class__
+ self.assertEqual(__class__, 42)
def test___class___instancemethod(self):
# See issue #14857