-
-
Notifications
You must be signed in to change notification settings - Fork 118
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Covert to defaultdict instead of plain dict #519
Comments
Hi, that's an interesting question. I think nobody's asked for it over the years (or I've forgotten about it); we should probably support it since it's a standard library thing. First you need a predicate function to see if a type is a defaultdict. Note that on 3.9+ (you're on 3.11) you don't need to use Something like this: from collections import defaultdict
from typing import DefaultDict, get_origin
def is_defaultdict(type: Any) -> bool:
"""Is this type a defaultdict?"""
return is_subclass(get_origin(type), (defaultdict, DefaultDict)) Now you need a structure hook factory. We can wrap an existing hook factory, from functools import partial
from typing import get_args
from cattrs.gen import make_mapping_structure_fn
from cattrs.dispatch import StructureHook
def structure_defaultdict_factory(type: type[defaultdict]) -> StructureHook:
value_type = get_args(type)[1]
return make_mapping_structure_fn(type, c, partial(defaultdict, value_type)) And then you tie to all together: c = TomlkitConverter()
c.register_structure_hook_factory(is_defaultdict, structure_defaultdict_factory) Now you can structure defaultdicts. Since defaultdicts take an arbitrary lambda when created it won't work for all defaultdicts, but should for most. I'll look into adding this to the next version. |
Thank you
Hey, thx, i didn't know it. The problem
In short, it works, thx for the working solution, but here what i'm thinking about it:
The quesiton
You mean the defaultdict case will be covered without the hook factory magic? |
Yeah, simple cases we can handle automatically. I'm working on a PR already. I can look at your other comments later, really busy with work ATM. |
No worries |
Description
I expect the method
SelectorConfig.load()
to convert the toml text to thedefaultdict
type inSelectorConfig.properties
. Instead, it is converted asdict
How to configure structurizing to make it recognizing the exact type which is
DefaultDict[str, LineStringProperties]
?What I Did
The text was updated successfully, but these errors were encountered: