[Python-ideas] __iter__(), keys(), and the mapping protocol
Brice Parent
contact at brice.xyz
Thu Sep 13 06:12:06 EDT 2018
Le 13/09/2018 à 10:07, Jonathan Fine a écrit :
> Now for my opinions. (Yours might be different.)
>
> First, it is my opinion that it is not reasonable to insist that the
> argument after ** must be a mapping. All that is required to construct
> a dictionary is a sequence of (key, value) pairs. The dict(iterable)
> construction proves that point.
>
> Second, relaxing the ** condition is useful. Consider the following.
>
> >>> class NS: pass
> >>> ns = NS()
>
> >>> ns.a = 3
> >>> ns.b = 5
>
> >>> ns.__dict__
> {'b': 5, 'a': 3}
>
> >>> def fn(**kwargs): return kwargs
>
> >>> fn(**ns)
> TypeError: fn() argument after ** must be a mapping, not NS
>
> >>> fn(**ns.__dict__)
> {'b': 5, 'a': 3}
I don't know about namespaces. It's probably been a concept I've often
used without putting a name on it.
But for dataclasses, I'd find it quite useful to have
{**my_data_class}
be a shortcut to
{**dataclasses.asdict(my_data_class)}
It's most likely what we'd want to achieve by unpacking a dataclass (or
at least, to my opinion). I'm not sure about the internals and the
weight of such a feature, but I guess a toy implementation would just
be, whenever we should raise a TypeError because the variable is not a
mapping, to check whether it's a dataclass instance, and if so, call
asdict on it, and return its result.
I'm not sure I'm not off-topic though...
More information about the Python-ideas
mailing list