按名称动态调用字典字段

时间:2020-07-05 21:45:15

标签: python

我有这样的功能,可以让我获取get_key(dictionary, 'path.to.key')这样的字典键

@staticmethod
def get_key(cont, key, default=None):
    def get_key_inner(parent, keys, default):
        if not keys:
            return default
        cur = keys.pop(0)
        if cur not in parent:
            return default
        if not keys:
            return parent[cur]
        if isinstance(parent[cur], dict):
            return get_key_inner(parent[cur], keys, default)
        return default
    return get_key_inner(cont, key.split('.'), default)

我想实现某种对象包装,该包装将接受字典作为参数,然后使用字典键按名称委派调用。像这样

class Wrapper:
    def __init__(self, dict_source):
        self.source = dict_source

leon_dict = { 
    'name': 'Leon', 
    'job': { 
        'title': 'engineer' 
    } 
 }

leon = Wrapper(leon_dict)
assert 'engineer' == leon.job.title # the same as leon['job']['title']

我能做到吗?

1 个答案:

答案 0 :(得分:2)

class Wrapper:
    def __init__(self, dict_source):
        self.source = dict_source

    def __getattr__(self, key):
        try:
            data = self.source[key]
            if isinstance(data, dict):
                return Wrapper(data)
            return data
        except KeyError as e:
            print(e)
            raise AttributeError()


leon_dict = {
    'name': 'Leon',
    'job': {
        'title': 'engineer'
    }
}

leon = Wrapper(leon_dict)
print(leon.job.title)
相关问题