[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