Python和字典就像对象

tho*_*mas 17 python dictionary duck-typing

我需要一个用于字典的python 3.1深度更新函数(一个递归更新父字典内的子字典的函数).

但我认为,在将来,我的函数可能必须处理行为像字典但不是字典的对象.而且我想避免使用isinstancetype(因为它们被认为是坏的,因为我几乎可以阅读每个Pythonista的博客).

但鸭子打字是Python的哲学的一部分,所以我怎么能检查对象是否像字典一样?

谢谢!

编辑:谢谢大家的答案.以防万一,我编码的函数可以在这个地方找到:http://blog.cafeaumiel.com/public/python/dict_deep_update.py

Ano*_*non 18

查看集合模块中的(新的3.x)抽象基类(ABC):

http://docs.python.org/3.1/library/collections.html

我会考虑使用isinstance对照映射,如下所示:

>>> import collections
>>> isinstance({},collections.Mapping)
True
Run Code Online (Sandbox Code Playgroud)

然后,如果你创建自己的类似dict的类,请创建collections.Mapping其中一个基础.

另一条路线是尝试并捕捉字典操作的任何异常, - 但是对于你正在谈论的递归,我宁愿先检查基类型,而不是处理找出dict或subict或其他dict成员是什么或者是什么没有抛出异常.

编辑添加:检查映射ABC而不是针对dict的好处是,相同的测试将适用于类似dict的类,无论它们是否是子类dict,所以它更灵活,以防万一.

  • 绝对正确:ABC 可以让您“针对接口而不是实现进行编程”,正如 Gof4 敦促您这样做!-) (2认同)