比较满意的 attrdict 实现

2016-11-04 15:50:18 +08:00
 petelin

dict 大家都知道,然后我想通过 dict.a 这样访问他的 key.想法很美好,但是实现上都很蹩脚,比如 dict.items 到底算是属性呢还是算方法呢?

所以我就改写了一下用法是这样的

   arg_post = LazeAttrDict(
        {'a': 2, 'keys': 'kk'},
        {
            'a': {
                'access': str
            },
            'b': {
                'default': 'default',
            },
            'items': {
                'default': [1, 2]
            },
            'values': {
                'default': 'vvv'
            }

        })
    assert arg_post.a == "2"
    assert arg_post.b == "default"
    assert arg_post.items == [1, 2]
    assert arg_post.values == "vvv"

    # 访问 dict 方法
    print("items 方法")
    for k, v in arg_post._items():
        print('\t', k, v)

    print("keys 方法")
    print("\t", list(arg_post._keys()))
    d = dict(**arg_post)
    print("dict 方法\n\t", d)

    print("唯一的 bug")
    print(arg_post.keys)

结果

items 方法
	 keys kk
	 a 2
	 values vvv
	 b default
	 items [1, 2]
keys 方法
	 ['keys', 'a', 'values', 'b', 'items']
dict 方法
	 {'keys': 'kk', 'b': 'default', 'a': '2', 'items': [1, 2], 'values': 'vvv'}
唯一的 bug
<bound method Mapping.keys of <__main__.LazeAttrDict object at 0x101c05c50>>

这个 dict 类第二个参数是用来自动校验参数的,有默认值,和转化类型两种方式.

要是 keys 那个方法也可以干掉就太完美了.

2026 次点击
所在节点    Python
1 条回复
petelin
2016-11-04 16:21:42 +08:00
通过调用站找到是否是**调用 dict,然后把 keys 给干掉了...总觉得会有 bug.

https://gist.github.com/Petelin/5b378c1aec8b43eccb72ff13a785e473

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/318057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX