8000 Perform similar optimisations to from_pydict to from_dict · Gobot1234/python-betterproto@64dbc67 · GitHub
[go: up one dir, main page]

Skip to content

Commit 64dbc67

Browse files
committed
Perform similar optimisations to from_pydict to from_dict
1 parent f044718 commit 64dbc67

File tree

1 file changed

+27
-30
lines changed

1 file changed

+27
-30
lines changed

src/betterproto/__init__.py

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,7 +1215,6 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
12151215
meta = self._betterproto.meta_by_field_name[field_name]
12161216
except KeyError:
12171217
continue
1218-
12191218
if value_ is None:
12201219
continue
12211220

@@ -1268,7 +1267,7 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
12681267
v = enum_cls.from_string(value_)
12691268
else:
12701269
v = value_
1271-
elif meta.proto_type in (TYPE_FLOAT, TYPE_DOUBLE):
1270+
elif meta.proto_type in {TYPE_FLOAT, TYPE_DOUBLE}:
12721271
v = (
12731272
[_parse_float(n) for n in value_]
12741273
if isinstance(value_, list)
@@ -1417,39 +1416,37 @@ def from_pydict(self: T, value: Dict[str, Any]) -> T:
14171416
The initialized message.
14181417
"""
14191418
self._serialized_on_wire = True
1420-
for key in value:
1419+
for key, value_ in value.items():
14211420
field_name = safe_snake_case(key)
1422-
meta = self._betterproto.meta_by_field_name.get(field_name)
1423-
if not meta:
1421+
try:
1422+
meta = self._betterproto.meta_by_field_name.get(field_name)
1423+
except KeyError:
1424+
continue
1425+
if value_ is None:
14241426
continue
14251427

1426-
if value[key] is not None:
1427-
if meta.proto_type == TYPE_MESSAGE:
1428-
v = getattr(self, field_name)
1429-
if isinstance(v, list):
1430-
cls = self._betterproto.cls_by_field[field_name]
1431-
for item in value[key]:
1432-
v.append(cls().from_pydict(item))
1433-
elif isinstance(v, datetime):
1434-
v = value[key]
1435-
elif isinstance(v, timedelta):
1436-
v = value[key]
1437-
elif meta.wraps:
1438-
v = value[key]
1439-
else:
1440-
# NOTE: `from_pydict` mutates the underlying message, so no
1441-
# assignment here is necessary.
1442-
v.from_pydict(value[key])
1443-
elif meta.map_types and meta.map_types[1] == TYPE_MESSAGE:
1444-
v = getattr(self, field_name)
1445-
cls = self._betterproto.cls_by_field[f"{field_name}.value"]
1446-
for k in value[key]:
1447-
v[k] = cls().from_pydict(value[key][k])
1428+
if meta.proto_type == TYPE_MESSAGE:
1429+
v = getattr(self, field_name)
1430+
if isinstance(v, list):
1431+
cls = self._betterproto.cls_by_field[field_name]
1432+
for item in value_:
1433+
v.append(cls().from_pydict(item))
1434+
elif isinstance(v, datetime) or isinstance(v, timedelta) or meta.wraps:
1435+
v = value_
14481436
else:
1449-
v = value[key]
1437+
# NOTE: `from_pydict` mutates the underlying message, so no
1438+
# assignment here is necessary.
1439+
v.from_pydict(value_)
1440+
elif meta.map_types and meta.map_types[1] == TYPE_MESSAGE:
1441+
v = getattr(self, field_name)
1442+
cls = self._betterproto.cls_by_field[f"{field_name}.value"]
1443+
for k in value_:
1444+
v[k] = cls().from_pydict(value_[k])
1445+
else:
1446+
v = value_
14501447

1451-
if v is not None:
1452-
setattr(self, field_name, v)
1448+
if v is not None:
1449+
setattr(self, field_name, v)
14531450
return self
14541451

14551452
def is_set(self, name: str) -> bool:

0 commit comments

Comments
 (0)
0