@@ -1202,72 +1202,72 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
1202
1202
The initialized message.
1203
1203
"""
1204
1204
self ._serialized_on_wire = True
1205
- for key in value :
1205
+ for key , v in value . items () :
1206
1206
field_name = safe_snake_case (key )
1207
1207
try :
1208
1208
meta = self ._betterproto .meta_by_field_name [field_name ]
1209
1209
except KeyError :
1210
1210
continue
1211
1211
1212
- if value [key ] is not None :
1213
- if meta .proto_type == TYPE_MESSAGE :
1214
- v = getattr (self , field_name )
1215
- cls = self ._betterproto .cls_by_field [field_name ]
1216
- if isinstance (v , list ):
1217
- if cls == datetime :
1218
- v = [isoparse (item ) for item in value [key ]]
1219
- elif cls == timedelta :
1220
- v = [
1221
- timedelta (seconds = float (item [:- 1 ]))
1222
- for item in value [key ]
1223
- ]
1224
- else :
1225
- v = [cls ().from_dict (item ) for item in value [key ]]
1226
- elif cls == datetime :
1227
- v = isoparse (value [key ])
1228
- setattr (self , field_name , v )
1229
- elif cls == timedelta :
1230
- v = timedelta (seconds = float (value [key ][:- 1 ]))
1231
- setattr (self , field_name , v )
1232
- elif meta .wraps :
1233
- setattr (self , field_name , value [key ])
1234
- elif v is None :
1235
- setattr (self , field_name , cls ().from_dict (value [key ]))
1212
+ if v is None :
1213
+ continue
1214
+
1215
+ if meta .proto_type == TYPE_MESSAGE :
1216
+ v = getattr (self , field_name )
1217
+ cls = self ._betterproto .cls_by_field [field_name ]
1218
+ if isinstance (v , list ):
1219
+ if cls is datetime :
1220
+ v = [isoparse (item ) for item in value [key ]]
1221
+ elif cls is timedelta :
1222
+ v = [timedelta (seconds = float (item [:- 1 ])) for item in value [key ]]
1236
1223
else :
1237
- # NOTE: `from_dict` mutates the underlying message, so no
1238
- # assignment here is necessary.
1239
- v .from_dict (value [key ])
1240
- elif meta .map_types and meta .map_types [1 ] == TYPE_MESSAGE :
1241
- v = getattr (self , field_name )
1242
- cls = self ._betterproto .cls_by_field [f"{ field_name } .value" ]
1243
- for k in value [key ]:
1244
- v [k ] = cls ().from_dict (value [key ][k ])
1224
+ v = [cls ().from_dict (item ) for item in value [key ]]
1225
+ elif cls is datetime :
1226
+ v = isoparse (value [key ])
1227
+ setattr (self , field_name , v )
1228
+ elif cls is timedelta :
1229
+ v = timedelta (seconds = float (value [key ][:- 1 ]))
1230
+ setattr (self , field_name , v )
1231
+ elif meta .wraps :
1232
+ setattr (self , field_name , value [key ])
1233
+ elif v is None :
1234
+ setattr (self , field_name , cls ().from_dict (value [key ]))
1245
1235
else :
1246
- v = value [key ]
1247
- if meta .proto_type in INT_64_TYPES :
1248
- if isinstance (value [key ], list ):
1249
- v = [int (n ) for n in value [key ]]
1250
- else :
1251
- v = int (value [key ])
1252
- elif meta .proto_type == TYPE_BYTES :
1253
- if isinstance (value [key ], list ):
1254
- v = [b64decode (n ) for n in value [key ]]
1255
- else :
1256
- v = b64decode (value [key ])
1257
- elif meta .proto_type == TYPE_ENUM :
1258
- enum_cls = self ._betterproto .cls_by_field [field_name ]
1259
- if isinstance (v , list ):
1260
- v = [enum_cls .from_string (e ) for e in v ]
1261
- elif isinstance (v , str ):
1262
- v = enum_cls .from_string (v )
1263
- elif meta .proto_type in (TYPE_FLOAT , TYPE_DOUBLE ):
1264
- if isinstance (value [key ], list ):
1265
- v = [_parse_float (n ) for n in value [key ]]
1266
- else :
1267
- v = _parse_float (value [key ])
1236
+ # NOTE: `from_dict` mutates the underlying message, so no
1237
+ # assignment here is necessary.
1238
+ v .from_dict (value [key ])
1239
+ elif meta .map_types and meta .map_types [1 ] == TYPE_MESSAGE :
1240
+ v = getattr (self , field_name )
1241
+ cls = self ._betterproto .cls_by_field [f"{ field_name } .value" ]
1242
+ for k in value [key ]:
1243
+ v [k ] = cls ().from_dict (value [key ][k ])
1244
+ elif meta .proto_type in INT_64_TYPES :
1245
+ v = (
1246
+ [int (n ) for n in value [key ]]
1247
+ if isinstance (value [key ], list )
1248
+ else int (value [key ])
1249
+ )
1268
1250
1269
- if v is not None :
1270
- setattr (self , field_name , v )
1251
+ elif meta .proto_type == TYPE_BYTES :
1252
+ v = (
1253
+ [b64decode (n ) for n in value [key ]]
1254
+ if isinstance (value [key ], list )
1255
+ else b64decode (value [key ])
1256
+ )
1257
+
1258
+ elif meta .proto_type == TYPE_ENUM :
1259
+ enum_cls = self ._betterproto .cls_by_field [field_name ]
1260
+ if isinstance (v , list ):
1261
+ v = [enum_cls .from_string (e ) for e in v ]
1262
+ elif isinstance (v , str ):
1263
+ v = enum_cls .from_string (v )
1264
+ elif meta .proto_type in {TYPE_FLOAT , TYPE_DOUBLE }:
1265
+ if isinstance (value [key ], list ):
1266
+ v = [_parse_float (n ) for n in value [key ]]
1267
+ else :
1268
+ v = _parse_float (value [key ])
1269
+
1270
+ setattr (self , field_name , v )
1271
1271
return self
1272
1272
1273
1273
def to_json (self , indent : Union [None , int , str ] = None ) -> str :
0 commit comments