1515
1616from dataclass_wizard import JSONWizard , LoadMeta
1717from dataclass_wizard .class_helper import create_new_class
18+ from dataclass_wizard .constants import PY314_OR_ABOVE
1819from dataclass_wizard .utils .string_conv import to_snake_case
1920
2021log = logging .getLogger (__name__ )
@@ -79,26 +80,28 @@ def data():
7980
8081def test_load (data , n ):
8182 """
82- [ RESULTS ON MAC OS X ]
83-
84- benchmarks.simple.simple - [INFO] dataclass-wizard 0.030784
85- benchmarks.simple.simple - [INFO] dataclass-factory 0.103156
86- benchmarks.simple.simple - [INFO] dataclasses-json 3.512702
87- benchmarks.simple.simple - [INFO] jsons 4.709339
88- benchmarks.simple.simple - [INFO] dacite 0.468830
89- benchmarks.simple.simple - [INFO] pydantic 0.071347
90- benchmarks.simple.simple - [INFO] marshmallow 2.155037
91- benchmarks.simple.simple - [INFO] attrs 0.020167
92- benchmarks.simple.simple - [INFO] mashumaro 0.041291
83+ [ RESULTS]
84+ platform darwin -- Python 3.13.11, pytest-8.3.4, pluggy-1.6.0
85+
86+ benchmarks.simple.simple - [INFO] dataclass-wizard 0.029298
87+ benchmarks.simple.simple - [INFO] dataclass-factory 0.100123
88+ benchmarks.simple.simple - [INFO] dataclasses-json 3.530623
89+ benchmarks.simple.simple - [INFO] jsons 4.920980
90+ benchmarks.simple.simple - [INFO] dacite 0.612328
91+ benchmarks.simple.simple - [INFO] pydantic 0.063677
92+ benchmarks.simple.simple - [INFO] marshmallow 2.197097
93+ benchmarks.simple.simple - [INFO] attrs 0.020192
94+ benchmarks.simple.simple - [INFO] mashumaro 0.040619
9395 """
9496 g = globals ().copy ()
9597 g .update (locals ())
9698
9799 # Add dacite and pydantic benchmarks
98100 log .info ("dataclass-wizard %f" ,
99101 timeit ("MyClassWizard.from_dict(data)" , globals = g , number = n ))
100- log .info ("dataclass-factory %f" ,
101- timeit ("factory.load(data, MyClass)" , globals = g , number = n ))
102+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
103+ log .info ("dataclass-factory %f" ,
104+ timeit ("factory.load(data, MyClass)" , globals = g , number = n ))
102105 log .info ("dataclasses-json %f" ,
103106 timeit ("MyClassDJ.from_dict(data)" , globals = g , number = n ))
104107 log .info ("jsons %f" ,
@@ -116,7 +119,8 @@ def test_load(data, n):
116119
117120 # Assert the dataclass instances have the same values for all fields.
118121 c1 = MyClassWizard .from_dict (data )
119- c2 = factory .load (data , MyClass )
122+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
123+ c2 = factory .load (data , MyClass )
120124 c3 = MyClassDJ .from_dict (data )
121125 c4 = MyClassJsons .load (data )
122126 c5 = dacite_from_dict (MyClass , data )
@@ -125,26 +129,32 @@ def test_load(data, n):
125129 c8 = MyClassAttrs (** data )
126130 c9 = MyClassMashumaro .from_dict (data )
127131
128- assert c1 .__dict__ == c2 .__dict__ == c3 .__dict__ == c4 .__dict__ == c5 .__dict__ == c6 .model_dump () == c7 == c8 .__dict__ == c9 .to_dict ()
132+ assert c1 .__dict__ == c3 .__dict__ == c4 .__dict__ == c5 .__dict__ == c6 .model_dump () == c7 == c8 .__dict__ == c9 .to_dict ()
133+
134+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
135+ assert c1 .__dict__ == c2 .__dict__
136+
129137
130138def test_dump (data , n ):
131139 """
132- [ RESULTS ON MAC OS X ]
133-
134- benchmarks.simple.simple - [INFO] dataclass-wizard 0.024619
135- benchmarks.simple.simple - [INFO] asdict (dataclasses) 0.093137
136- benchmarks.simple.simple - [INFO] dataclass-factory 0.188235
137- benchmarks.simple.simple - [INFO] dataclasses-json 1.294685
138- benchmarks.simple.simple - [INFO] jsons 6.913666
140+ [ RESULTS]
141+ platform darwin -- Python 3.13.11, pytest-8.3.4, pluggy-1.6.0
142+
143+ benchmarks.simple.simple - [INFO] dataclass-wizard 0.010870
144+ benchmarks.simple.simple - [INFO] asdict (dataclasses) 0.085224
145+ benchmarks.simple.simple - [INFO] dataclass-factory 0.070084
146+ benchmarks.simple.simple - [INFO] dataclasses-json 1.272380
147+ benchmarks.simple.simple - [INFO] jsons 5.980036
139148 benchmarks.simple.simple - [INFO] dacite (not applicable) -- skipped
140- benchmarks.simple.simple - [INFO] pydantic 0.066996
141- benchmarks.simple.simple - [INFO] marshmallow 0.000519
142- benchmarks.simple.simple - [INFO] attrs 0.122752
143- benchmarks.simple.simple - [INFO] mashumaro 0.008702
149+ benchmarks.simple.simple - [INFO] pydantic 0.079050
150+ benchmarks.simple.simple - [INFO] marshmallow 0.000489
151+ benchmarks.simple.simple - [INFO] attrs 0.054118
152+ benchmarks.simple.simple - [INFO] mashumaro 0.008982
144153 """
145154
146155 c1 = MyClassWizard .from_dict (data )
147- c2 = factory .load (data , MyClass )
156+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
157+ c2 = factory .load (data , MyClass )
148158 c3 = MyClassDJ .from_dict (data )
149159 c4 = MyClassJsons .load (data )
150160 c5 = dacite_from_dict (MyClass , data )
@@ -160,8 +170,9 @@ def test_dump(data, n):
160170 timeit ("c1.to_dict()" , globals = g , number = n ))
161171 log .info ("asdict (dataclasses) %f" ,
162172 timeit ("asdict(c1)" , globals = g , number = n ))
163- log .info ("dataclass-factory %f" ,
164- timeit ("factory.dump(c2, MyClass)" , globals = g , number = n ))
173+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
174+ log .info ("dataclass-factory %f" ,
175+ timeit ("factory.dump(c2, MyClass)" , globals = g , number = n ))
165176 log .info ("dataclasses-json %f" ,
166177 timeit ("c3.to_dict()" , globals = g , number = n ))
167178 log .info ("jsons %f" ,
@@ -179,4 +190,7 @@ def test_dump(data, n):
179190 # Assert the dict objects which are the result of `to_dict` are all equal.
180191 c1_dict = {to_snake_case (f ): fval for f , fval in c1 .to_dict ().items ()}
181192
182- assert c1_dict == factory .dump (c2 , MyClass ) == c3 .to_dict () == c4 .dump () == c6 .model_dump () == attr .asdict (c8 ) == c9 .to_dict ()
193+ assert c1_dict == c3 .to_dict () == c4 .dump () == c6 .model_dump () == attr .asdict (c8 ) == c9 .to_dict ()
194+
195+ if not PY314_OR_ABOVE : # breaks on Python 3.14+
196+ assert c1_dict == factory .dump (c2 , MyClass )
0 commit comments