fix that, no dict support

pull/33208/head
Shane Smiskol 1 year ago
parent a29227618f
commit 6d56b1a611
  1. 7
      selfdrive/car/card.py
  2. 2
      selfdrive/car/structs.py

@ -3,6 +3,7 @@ import capnp
import dataclasses import dataclasses
import os import os
import time import time
from typing import Any
import cereal.messaging as messaging import cereal.messaging as messaging
@ -60,18 +61,20 @@ def can_comm_callbacks(logcan: messaging.SubSocket, sendcan: messaging.PubSocket
return can_recv, can_send return can_recv, can_send
def asdict(obj) -> dict[str, any]: def asdict(obj) -> dict[str, Any]:
"""Note that this function returns references rather than copies where possible""" """Note that this function returns references rather than copies where possible"""
if not dataclasses.is_dataclass(obj): if not dataclasses.is_dataclass(obj):
raise TypeError("asdict() should be called on dataclass instances") raise TypeError("asdict() should be called on dataclass instances")
def _asdict_inner(obj: any) -> dict[str, any]: def _asdict_inner(obj):
if dataclasses.is_dataclass(obj): if dataclasses.is_dataclass(obj):
ret = {} ret = {}
for f in dataclasses.fields(obj): for f in dataclasses.fields(obj):
ret[f.name] = _asdict_inner(getattr(obj, f.name)) ret[f.name] = _asdict_inner(getattr(obj, f.name))
return ret return ret
elif isinstance(obj, (tuple, list)):
return type(obj)(_asdict_inner(v) for v in obj)
else: else:
return obj return obj

@ -18,7 +18,7 @@ def auto_dataclass(cls=None, /, **kwargs):
origin_typ = get_origin(typ) or typ origin_typ = get_origin(typ) or typ
if isinstance(origin_typ, str): if isinstance(origin_typ, str):
raise TypeError(f"Forward references are not supported for auto_field: '{origin_typ}'. Use a default_factory with lambda instead.") raise TypeError(f"Forward references are not supported for auto_field: '{origin_typ}'. Use a default_factory with lambda instead.")
elif origin_typ in (int, float, str, bytes, list, tuple, set, dict, bool) or is_dataclass(origin_typ): elif origin_typ in (int, float, str, bytes, list, tuple, set, bool) or is_dataclass(origin_typ):
setattr(cls, name, field(default_factory=origin_typ)) setattr(cls, name, field(default_factory=origin_typ))
elif origin_typ is None: elif origin_typ is None:
setattr(cls, name, field(default=origin_typ)) setattr(cls, name, field(default=origin_typ))

Loading…
Cancel
Save