@@ -123,6 +123,15 @@ class UnFrozenDataClass:
123123 x : int
124124 y : int
125125
126+ @dataclasses .dataclass (frozen = True , kw_only = True )
127+ class FrozenUnInitKwOnlyDataClass :
128+ side : int
129+ area : int = dataclasses .field (init = False )
130+
131+ def __post_init__ (self ):
132+ # Hack to update an attribute in a frozen dataclass.
133+ object .__setattr__ (self , 'area' , self .side ** 2 )
134+
126135
127136# These tests need to all be run in the same process due to the asserts
128137# in tearDownClass.
@@ -309,6 +318,7 @@ def test_deterministic_coder(self, compat_version):
309318 if dataclasses is not None :
310319 self .check_coder (deterministic_coder , FrozenDataClass (1 , 2 ))
311320 self .check_coder (deterministic_coder , FrozenKwOnlyDataClass (c = 1 , d = 2 ))
321+ self .check_coder (deterministic_coder , FrozenUnInitKwOnlyDataClass (side = 11 ))
312322
313323 with self .assertRaises (TypeError ):
314324 self .check_coder (deterministic_coder , UnFrozenDataClass (1 , 2 ))
@@ -750,6 +760,7 @@ def test_cross_process_encoding_of_special_types_is_deterministic(
750760 from apache_beam.coders.coders_test_common import DefinesGetAndSetState
751761 from apache_beam.coders.coders_test_common import FrozenDataClass
752762 from apache_beam.coders.coders_test_common import FrozenKwOnlyDataClass
763+ from apache_beam.coders.coders_test_common import FrozenUnInitKwOnlyDataClass
753764
754765
755766 from apache_beam.coders import proto2_coder_test_messages_pb2 as test_message
@@ -786,7 +797,7 @@ def test_cross_process_encoding_of_special_types_is_deterministic(
786797 ("frozen_dataclass", FrozenDataClass(1, 2)),
787798 ("frozen_dataclass_list", [FrozenDataClass(1, 2), FrozenDataClass(3, 4)]),
788799 ("frozen_kwonly_dataclass", FrozenKwOnlyDataClass(c=1, d=2)),
789- ("frozen_kwonly_dataclass_list", [FrozenKwOnlyDataClass(c=1, d=2), FrozenKwOnlyDataClass(c=3, d=4 )]),
800+ ("frozen_kwonly_dataclass_list", [FrozenKwOnlyDataClass(c=1, d=2), FrozenUnInitKwOnlyDataClass(side=3 )]),
790801 ])
791802
792803 compat_version = { '"' + compat_version + '"' if compat_version else None }
0 commit comments