[Python-ideas] Unpacking a dict

Sven R. Kunze srkunze at mail.de
Thu May 26 12:32:15 EDT 2016

On 25.05.2016 16:06, Ian Foote wrote:
> I can see this being useful if I have a Django Rest Framework validate 
> method 
> (http://www.django-rest-framework.org/api-guide/serializers/#object-level-validation) 
> which takes a dictionary argument.
> def validate(self, data):
>     {'name': name, 'address': address} = data
> Currently, this would look like:
> def validate(self, data):
>     name, address = data['name'], data['address']

Now, that you mention it (the restframework), I remember a concrete 
usecase for our systems as well. We receive a YAML resource (via the 
restframework -- that's the association) and we know it must be a dict 
and contain several items. Additionally, we need the remaining items to 
store somewhere else depending on some of the received data.

{'needed1': needed1, 'needed2': needed2, **rest}  = yaml_data
store_there(needed1, rest)
store_somewhere(needed2, rest)

Please note, that needed1 and needed2 are not allowed to be part of the 
data which is supposed to be stored. These are mere flags.

> It does get more useful with the extension:
> def validate(self, data):
>     {'name': name, 'address': address, **rest} = data

Does using ** instead of * seem more appropriate?

> instead of:
> def validate(self, data):
>     rest = data.copy()
>     name = rest.pop('name')
>     address = rest.pop('address')
> In the rest framework case, mutating data directly might not be a 
> problem, but this does feel like a nice syntax when avoiding mutation 
> is required.
> Regards,
> Ian


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20160526/6caf255a/attachment.html>

More information about the Python-ideas mailing list