Skip to content

Instantly share code, notes, and snippets.

@brettvitaz
Last active January 9, 2023 18:06
Show Gist options
  • Save brettvitaz/9281ec73ada8f11eed06f35105cf2b31 to your computer and use it in GitHub Desktop.
Save brettvitaz/9281ec73ada8f11eed06f35105cf2b31 to your computer and use it in GitHub Desktop.
dataclasses-json Counter deserialization example
from collections import Counter
from dataclasses import dataclass, field
from dataclasses_json import dataclass_json
from utils import counter_config
@dataclass_json
@dataclass
class Data:
count: Counter = field(default_factory=Counter, metadata=counter_config)
if __name__ == '__main__':
d = Data()
d.count["Fireball"] += 1
d.count[42] = 13
json = d.to_json()
print(json)
d2 = Data.from_json(json)
print(d2)
from collections import Counter
from typing import Any, Type
from dataclasses_json import config
separator = "://"
supported_types = [int, float]
encode_types: dict[Type, str] = {k: f"{k.__name__}{separator}" for k in supported_types}
decode_types: dict[str, Type] = {k.__name__: k for k in supported_types}
def counter_encoder(args: dict[Any, int]):
return {f"{encode_types.get(type(k), k)}": v for k, v in args.items()}
def counter_decoder(args: dict[str, int]):
ret: dict[Any, int] = {}
for k, v in args.items():
split = k.split(separator)
ret[decode_types[split[0]](1) if split[0] in decode_types.keys() else k] = v
return Counter(ret)
counter_config = config(encoder=counter_encoder, decoder=counter_decoder)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment