@@ -2705,7 +2705,7 @@ def test_set_name(self):
27052705 # Create a descriptor.
27062706 class D :
27072707 def __set_name__ (self , owner , name ):
2708- self .name = name
2708+ self .name = name + 'x'
27092709 def __get__ (self , instance , owner ):
27102710 if instance is not None :
27112711 return 1
@@ -2716,15 +2716,15 @@ def __get__(self, instance, owner):
27162716 @dataclass
27172717 class C :
27182718 c : int = D ()
2719- self .assertEqual (C .c .name , 'c ' )
2719+ self .assertEqual (C .c .name , 'cx ' )
27202720
27212721 # Now test with a default value and init=False, which is the
27222722 # only time this is really meaningful. If not using
27232723 # init=False, then the descriptor will be overwritten, anyway.
27242724 @dataclass
27252725 class C :
27262726 c : int = field (default = D (), init = False )
2727- self .assertEqual (C .c .name , 'c ' )
2727+ self .assertEqual (C .c .name , 'cx ' )
27282728 self .assertEqual (C ().c , 1 )
27292729
27302730 def test_non_descriptor (self ):
@@ -2733,12 +2733,41 @@ def test_non_descriptor(self):
27332733
27342734 class D :
27352735 def __set_name__ (self , owner , name ):
2736- self .name = name
2736+ self .name = name + 'x'
27372737
27382738 @dataclass
27392739 class C :
27402740 c : int = field (default = D (), init = False )
2741- self .assertEqual (C .c .name , 'c' )
2741+ self .assertEqual (C .c .name , 'cx' )
2742+
2743+ def test_lookup_on_instance (self ):
2744+ # See bpo-33175.
2745+ class D :
2746+ pass
2747+
2748+ d = D ()
2749+ # Create an attribute on the instance, not type.
2750+ d .__set_name__ = Mock ()
2751+
2752+ # Make sure d.__set_name__ is not called.
2753+ @dataclass
2754+ class C :
2755+ i : int = field (default = d , init = False )
2756+
2757+ self .assertEqual (d .__set_name__ .call_count , 0 )
2758+
2759+ def test_lookup_on_class (self ):
2760+ # See bpo-33175.
2761+ class D :
2762+ pass
2763+ D .__set_name__ = Mock ()
2764+
2765+ # Make sure D.__set_name__ is called.
2766+ @dataclass
2767+ class C :
2768+ i : int = field (default = D (), init = False )
2769+
2770+ self .assertEqual (D .__set_name__ .call_count , 1 )
27422771
27432772
27442773if __name__ == '__main__' :
0 commit comments