8000 Simplify from_dict a tad and reduce number of comparisons · Gobot1234/python-betterproto@fac0ed3 · GitHub
[go: up one dir, main page]

Skip to content

Commit fac0ed3

Browse files
committed
Simplify from_dict a tad and reduce number of comparisons
1 parent 2b2debf commit fac0ed3

File tree

1 file changed

+57
-57
lines changed

1 file changed

+57
-57
lines changed

src/betterproto/__init__.py

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,72 +1202,72 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
12021202
The initialized message.
12031203
"""
12041204
self._serialized_on_wire = True
1205-
for key in value:
1205+
for key, v in value.items():
12061206
field_name = safe_snake_case(key)
12071207
try:
12081208
meta = self._betterproto.meta_by_field_name[field_name]
12091209
except KeyError:
12101210
continue
12111211

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]]
12361223
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]))
12451235
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+
)
12681250

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)
12711271
return self
12721272

12731273
def to_json(self, indent: Union[None, int, str] = None) -> str:

0 commit comments

Comments
 (0)
0