Skip to content

Instantly share code, notes, and snippets.

@reutsharabani
Created December 20, 2017 12:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reutsharabani/7c6e4850853d62e029b5e2677c5fd414 to your computer and use it in GitHub Desktop.
Save reutsharabani/7c6e4850853d62e029b5e2677c5fd414 to your computer and use it in GitHub Desktop.
from itertools import chain
import inspect
# very naive deastruct implementation (not native...)
def _destruct(selector):
def _(value):
if isinstance(selector, dict):
yield from chain.from_iterable(_destruct(selector[k])(value[k]) for k in selector)
return
if isinstance(selector, list):
yield from chain.from_iterable(_destruct(a)(b) for a, b in zip(selector, value))
return
yield selector, value
return _
def destruct(selector):
def _(value):
new_locals = dict(_destruct(selector)(value))
# print('updating locals: %s' % new_locals)
inspect.currentframe().f_back.f_locals.update(new_locals)
return _
@reutsharabani
Copy link
Author

reutsharabani commented Dec 20, 2017

Sample usage:

# destruct the list into `my_list`
v = {'a': {'b': [1, 2, 3]}}
destruct({'a': {'b': 'my_list'}})(v)

Now my_list is mapped to the list locally:

>>> my_list
[1, 2, 3]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment