Use new `msgspec.structs` api for `.typecast()`

basic_buy_bot
Tyler Goodlet 2023-06-20 13:51:37 -04:00
parent 994564f923
commit 00a51c0288
1 changed files with 25 additions and 21 deletions

View File

@ -22,11 +22,15 @@ import builtins
# import sys
from pprint import pformat
import msgspec
from msgspec import (
msgpack,
Struct,
structs,
)
class Struct(
msgspec.Struct,
Struct,
# https://jcristharif.com/msgspec/structs.html#tagged-unions
# tag='pikerstruct',
@ -37,10 +41,14 @@ class Struct(
'''
def to_dict(self) -> dict:
return {
f: getattr(self, f)
for f in self.__struct_fields__
}
'''
Like it sounds.. direct delegation to:
https://jcristharif.com/msgspec/api.html#msgspec.structs.asdict
TODO: probably just drop this method since it's now a built-int method?
'''
return structs.asdict(self)
def pformat(self) -> str:
return f'Struct({pformat(self.to_dict())})'
@ -49,7 +57,7 @@ class Struct(
self,
update: dict | None = None,
) -> msgspec.Struct:
) -> Struct:
'''
Validate-typecast all self defined fields, return a copy of
us with all such fields.
@ -66,15 +74,15 @@ class Struct(
# NOTE: roundtrip serialize to validate
# - enode to msgpack binary format,
# - decode that back to a struct.
return msgspec.msgpack.Decoder(
type=type(self)
).decode(
msgspec.msgpack.Encoder().encode(self)
return msgpack.Decoder(type=type(self)).decode(
msgpack.Encoder().encode(self)
)
def typecast(
self,
# fields: list[str] | None = None,
# TODO: allow only casting a named subset?
# fields: set[str] | None = None,
) -> None:
'''
@ -85,15 +93,11 @@ class Struct(
``.copy()`` above in such cases.
'''
annots: dict = self.__annotations__
for fname, ftype in annots.items():
if isinstance(ftype, str):
print(f'{self} has `str` annotations!?\n{annots}\n')
ftype = getattr(builtins, ftype)
attr = getattr(self, fname)
# https://jcristharif.com/msgspec/api.html#msgspec.structs.fields
fi: structs.FieldInfo
for fi in structs.fields(self):
setattr(
self,
fname,
ftype(attr),
fi.name,
fi.type(getattr(self, fi.name)),
)