@@ -4140,6 +4140,130 @@ def test_text_annotations(self):
41404140 {'foo' : dataclass_textanno .Foo ,
41414141 'return' : type (None )})
41424142
4143+ def test_dataclass_from_another_module (self ):
4144+ # see bpo-45524
4145+ from test .test_dataclasses import dataclass_textanno
4146+ from dataclasses import dataclass
4147+
4148+ @dataclass
4149+ class Default (dataclass_textanno .Bar ):
4150+ pass
4151+
4152+ @dataclass (init = False )
4153+ class WithInitFalse (dataclass_textanno .Bar ):
4154+ pass
4155+
4156+ @dataclass (init = False )
4157+ class CustomInit (dataclass_textanno .Bar ):
4158+ def __init__ (self , foo : dataclass_textanno .Foo ) -> None :
4159+ pass
4160+
4161+ @dataclass
4162+ class FutureInitChild (dataclass_textanno .WithFutureInit ):
4163+ pass
4164+
4165+ classes = [
4166+ Default ,
4167+ WithInitFalse ,
4168+ CustomInit ,
4169+ dataclass_textanno .WithFutureInit ,
4170+ FutureInitChild ,
4171+ ]
4172+ for klass in classes :
4173+ with self .subTest (klass = klass ):
4174+ self .assertEqual (
4175+ get_type_hints (klass ),
4176+ {'foo' : dataclass_textanno .Foo },
4177+ )
4178+ self .assertEqual (get_type_hints (klass .__new__ ), {})
4179+ self .assertEqual (
4180+ get_type_hints (klass .__init__ ),
4181+ {'foo' : dataclass_textanno .Foo , 'return' : type (None )},
4182+ )
4183+
4184+ def test_dataclass_from_proxy_module (self ):
4185+ # see bpo-45524
4186+ from test .test_dataclasses import dataclass_textanno
4187+ from test .test_dataclasses import dataclass_textanno2
4188+ from dataclasses import dataclass
4189+
4190+ @dataclass
4191+ class Default (dataclass_textanno2 .Child ):
4192+ pass
4193+
4194+ @dataclass (init = False )
4195+ class WithInitFalse (dataclass_textanno2 .Child ):
4196+ pass
4197+
4198+ @dataclass (init = False )
4199+ class CustomInit (dataclass_textanno2 .Child ):
4200+ def __init__ (
4201+ self ,
4202+ foo : dataclass_textanno .Foo ,
4203+ custom : dataclass_textanno2 .Custom ,
4204+ ) -> None :
4205+ pass
4206+
4207+ @dataclass
4208+ class FutureInitChild (dataclass_textanno2 .WithFutureInit ):
4209+ pass
4210+
4211+ classes = [
4212+ Default ,
4213+ WithInitFalse ,
4214+ CustomInit ,
4215+ dataclass_textanno2 .WithFutureInit ,
4216+ FutureInitChild ,
4217+ ]
4218+ for klass in classes :
4219+ with self .subTest (klass = klass ):
4220+ self .assertEqual (
4221+ get_type_hints (klass ),
4222+ {
4223+ 'foo' : dataclass_textanno .Foo ,
4224+ 'custom' : dataclass_textanno2 .Custom ,
4225+ },
4226+ )
4227+ self .assertEqual (get_type_hints (klass .__new__ ), {})
4228+ self .assertEqual (
4229+ get_type_hints (klass .__init__ ),
4230+ {
4231+ 'foo' : dataclass_textanno .Foo ,
4232+ 'custom' : dataclass_textanno2 .Custom ,
4233+ 'return' : type (None ),
4234+ },
4235+ )
4236+
4237+ def test_dataclass_proxy_modules_matching_name_override (self ):
4238+ # see bpo-45524
4239+ from test .test_dataclasses import dataclass_textanno2
4240+ from dataclasses import dataclass
4241+
4242+ @dataclass
4243+ class Default (dataclass_textanno2 .WithMatchingNameOverride ):
4244+ pass
4245+
4246+ classes = [
4247+ Default ,
4248+ dataclass_textanno2 .WithMatchingNameOverride
4249+ ]
4250+ for klass in classes :
4251+ with self .subTest (klass = klass ):
4252+ self .assertEqual (
4253+ get_type_hints (klass ),
4254+ {
4255+ 'foo' : dataclass_textanno2 .Foo ,
4256+ },
4257+ )
4258+ self .assertEqual (get_type_hints (klass .__new__ ), {})
4259+ self .assertEqual (
4260+ get_type_hints (klass .__init__ ),
4261+ {
4262+ 'foo' : dataclass_textanno2 .Foo ,
4263+ 'return' : type (None ),
4264+ },
4265+ )
4266+
41434267
41444268ByMakeDataClass = make_dataclass ('ByMakeDataClass' , [('x' , int )])
41454269ManualModuleMakeDataClass = make_dataclass ('ManualModuleMakeDataClass' ,
0 commit comments