Skip to content

Commit 3337c8e

Browse files
committed
Optimise from_dict slightly better
1 parent c6c5d99 commit 3337c8e

File tree

1 file changed

+23
-29
lines changed

1 file changed

+23
-29
lines changed

src/betterproto/__init__.py

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,56 +1215,50 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
12151215
v = getattr(self, field_name)
12161216
cls = self._betterproto.cls_by_field[field_name]
12171217
if isinstance(v, list):
1218-
if cls is datetime:
1219-
v = [isoparse(item) for item in value[key]]
1220-
elif cls is timedelta:
1221-
v = [timedelta(seconds=float(item[:-1])) for item in value[key]]
1218+
if cls == datetime:
1219+
v = [isoparse(item) for item in v]
1220+
elif cls == timedelta:
1221+
v = [timedelta(seconds=float(item[:-1])) for item in v]
12221222
else:
1223-
v = [cls().from_dict(item) for item in value[key]]
1224-
elif cls is datetime:
1225-
v = isoparse(value[key])
1223+
v = [cls().from_dict(item) for item in v]
1224+
elif cls == datetime:
1225+
v = isoparse(v)
12261226
setattr(self, field_name, v)
1227-
elif cls is timedelta:
1228-
v = timedelta(seconds=float(value[key][:-1]))
1227+
elif cls == timedelta:
1228+
v = timedelta(seconds=float(v[:-1]))
12291229
setattr(self, field_name, v)
12301230
elif meta.wraps:
1231-
setattr(self, field_name, value[key])
1231+
setattr(self, field_name, v)
12321232
elif v is None:
1233-
setattr(self, field_name, cls().from_dict(value[key]))
1233+
setattr(self, field_name, cls().from_dict(v))
12341234
else:
12351235
# NOTE: `from_dict` mutates the underlying message, so no
12361236
# assignment here is necessary.
1237-
v.from_dict(value[key])
1237+
v.from_dict(v)
12381238
elif meta.map_types and meta.map_types[1] == TYPE_MESSAGE:
12391239
v = getattr(self, field_name)
12401240
cls = self._betterproto.cls_by_field[f"{field_name}.value"]
1241-
for k in value[key]:
1242-
v[k] = cls().from_dict(value[key][k])
1241+
target = value[key]
1242+
for k in target:
1243+
v[k] = cls().from_dict(target[k])
12431244
elif meta.proto_type in INT_64_TYPES:
1244-
v = (
1245-
[int(n) for n in value[key]]
1246-
if isinstance(value[key], list)
1247-
else int(value[key])
1248-
)
1245+
v = [int(n) for n in v] if isinstance(v, list) else int(v)
12491246

12501247
elif meta.proto_type == TYPE_BYTES:
1251-
v = (
1252-
[b64decode(n) for n in value[key]]
1253-
if isinstance(value[key], list)
1254-
else b64decode(value[key])
1255-
)
1248+
v = [b64decode(n) for n in v] if isinstance(v, list) else b64decode(v)
12561249

12571250
elif meta.proto_type == TYPE_ENUM:
1258-
enum_cls = self._betterproto.cls_by_field[field_name]
1251+
enum_cls: Enum = self._betterproto.cls_by_field[field_name]
12591252
if isinstance(v, list):
12601253
v = [enum_cls.from_string(e) for e in v]
12611254
elif isinstance(v, str):
12621255
v = enum_cls.from_string(v)
12631256
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])
1257+
v = (
1258+
[_parse_float(n) for n in v]
1259+
if isinstance(v, list)
1260+
else _parse_float(v)
1261+
)
12681262

12691263
setattr(self, field_name, v)
12701264
return self

0 commit comments

Comments
 (0)