4 ms·
You can get part of the way there with operator.attrgetter: NT = collections.namedtuple('NT', ['x', 'y']) nt1 = NT(1, 2) nt2 = NT(nt1, 'asdf') assert nt2.x.
by CloudYeller 9y ago
You can get part of the way there with operator.attrgetter:
NT = collections.namedtuple('NT', ['x', 'y'])
nt1 = NT(1, 2)
nt2 = NT(nt1, 'asdf')
assert nt2.x.y == 2
get_two = operator.attrgetter('x.y')
assert get_two(nt2) == 2
If you wrap the operator.attrgetter in a try/catch, you can force a default too: https://pastebin.com/bFxGr22E https://pastebin.com/bFxGr22E
- smoe 9y agoI never thought much about best implementation because I only used it i think once in ten years. But afaik I used something like this, that does the job and is easy to read _empty = object() def deep_get(dct, dotted_path, default=_empty): for key in dotted_path.split('.'): try: dct = dct[key] except KeyError: if default is _empty: raise return default return dct