Skip to content

Instantly share code, notes, and snippets.

@alexsavio
Created August 30, 2022 12:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexsavio/7ec8e9aa62b1bf5eb78c94d9edcb6f20 to your computer and use it in GitHub Desktop.
Save alexsavio/7ec8e9aa62b1bf5eb78c94d9edcb6f20 to your computer and use it in GitHub Desktop.
Python simple nested structure access
# -*- coding: utf-8 -*-
from functools import singledispatch
def getvalue(value, path, default=None):
"""Get a named attribute or item from an object; getvalue(x, 'y.z')
is equivalent to x.y.z
When a default argument is given, it is returned when the attribute doesn't
exist; without it, None returned
List indexing supported x.0.y.1.z etc.
"""
paths = path.split(".")
return get_nested(value, *paths, default=default)
@singledispatch
def get_nested(value, path, *paths, default=None):
value = getattr(value, path, default)
if paths:
return get_nested(value, *paths, default=default)
return value
@get_nested.register(dict)
def get_nested_dict(value, path, *paths, default=None):
value = value.get(path, default)
if paths:
return get_nested(value, *paths, default=default)
return value
@get_nested.register(list)
@get_nested.register(tuple)
def get_nested_list(value, path, *paths, default=None):
try:
value = value[int(path)]
except IndexError:
value = default
if paths:
return get_nested(value, *paths, default=default)
return value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment