summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_dataclasses.py
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-03-29 15:32:36 (GMT)
committerGitHub <noreply@github.com>2018-03-29 15:32:36 (GMT)
commitfaa6f5c74ca56d4cc0dd9db78d5c8e864b617d0c (patch)
tree60e216a5ec9c292df7b2a6682e9d745c8c654eaf /Lib/test/test_dataclasses.py
parente557b5c479bd7ffca36f0c1b300e8c795c7a8ab4 (diff)
downloadcpython-faa6f5c74ca56d4cc0dd9db78d5c8e864b617d0c.zip
cpython-faa6f5c74ca56d4cc0dd9db78d5c8e864b617d0c.tar.gz
cpython-faa6f5c74ca56d4cc0dd9db78d5c8e864b617d0c.tar.bz2
bpo-33175: dataclasses should look up __set_name__ on class, not instance (GH-6305)
(cherry picked from commit 521995205a2cb6b504fe0e39af22a81f785350a3) Co-authored-by: Eric V. Smith <ericvsmith@users.noreply.github.com>
Diffstat (limited to 'Lib/test/test_dataclasses.py')
-rwxr-xr-xLib/test/test_dataclasses.py39
1 files changed, 34 insertions, 5 deletions
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py
index 2745eaf..5cd424c 100755
--- a/Lib/test/test_dataclasses.py
+++ b/Lib/test/test_dataclasses.py
@@ -2705,7 +2705,7 @@ class TestDescriptors(unittest.TestCase):
# Create a descriptor.
class D:
def __set_name__(self, owner, name):
- self.name = name
+ self.name = name + 'x'
def __get__(self, instance, owner):
if instance is not None:
return 1
@@ -2716,7 +2716,7 @@ class TestDescriptors(unittest.TestCase):
@dataclass
class C:
c: int=D()
- self.assertEqual(C.c.name, 'c')
+ self.assertEqual(C.c.name, 'cx')
# Now test with a default value and init=False, which is the
# only time this is really meaningful. If not using
@@ -2724,7 +2724,7 @@ class TestDescriptors(unittest.TestCase):
@dataclass
class C:
c: int=field(default=D(), init=False)
- self.assertEqual(C.c.name, 'c')
+ self.assertEqual(C.c.name, 'cx')
self.assertEqual(C().c, 1)
def test_non_descriptor(self):
@@ -2733,12 +2733,41 @@ class TestDescriptors(unittest.TestCase):
class D:
def __set_name__(self, owner, name):
- self.name = name
+ self.name = name + 'x'
@dataclass
class C:
c: int=field(default=D(), init=False)
- self.assertEqual(C.c.name, 'c')
+ self.assertEqual(C.c.name, 'cx')
+
+ def test_lookup_on_instance(self):
+ # See bpo-33175.
+ class D:
+ pass
+
+ d = D()
+ # Create an attribute on the instance, not type.
+ d.__set_name__ = Mock()
+
+ # Make sure d.__set_name__ is not called.
+ @dataclass
+ class C:
+ i: int=field(default=d, init=False)
+
+ self.assertEqual(d.__set_name__.call_count, 0)
+
+ def test_lookup_on_class(self):
+ # See bpo-33175.
+ class D:
+ pass
+ D.__set_name__ = Mock()
+
+ # Make sure D.__set_name__ is called.
+ @dataclass
+ class C:
+ i: int=field(default=D(), init=False)
+
+ self.assertEqual(D.__set_name__.call_count, 1)
if __name__ == '__main__':