我需要一个用于字典的 python 3.1 深度更新函数(该函数将递归更新父字典内的子字典)。
但我认为,将来,我的函数可能必须处理行为类似于字典但实际上并非如此的对象。此外我想避免使用isinstance
and type
(因为它们被认为是不好的,因为我几乎可以在每个 Pythonista 的博客上读到)。
但鸭子类型是 Python 哲学的一部分,那么我如何检查一个对象是否类似于字典呢?
Thanks!
编辑:感谢大家的回答。以防万一,我编码的函数可以在这个地方找到:http://blog.cafeaumiel.com/public/python/dict_deep_update.py http://blog.cafeaumiel.com/public/python/dict_deep_update.py
查看集合模块中的(3.x 中的新增)抽象基类 (ABC):
http://docs.python.org/3.1/library/collections.html http://docs.python.org/3.1/library/collections.html
我会考虑使用 isinstance 对照映射进行检查,如下所示:
>>> import collections
>>> isinstance({},collections.Mapping)
True
然后,如果您创建自己的类似字典的类,请创建 collections.Mapping 其基础之一。
另一条路线是尝试捕获字典操作的任何异常,但是通过您正在讨论的递归,我宁愿首先检查基本类型,而不是处理弄清楚什么是 dict 或 subdict 或其他 dict 成员不在那里抛出异常。
编辑添加:检查映射 ABC 而不是检查 dict 的好处是,相同的测试将适用于类似 dict 的类,无论它们是否是 dict 的子类,因此它更灵活,以防万一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)