Python中的“dict-like”是什么意思?

时间:2015-11-21 16:11:46

标签: python dictionary types

偶尔人们会在Python中引用“类X”对象。 Example:

  

data_iter_maker - 一个零参数callable,它返回一个类似dict的数据对象的迭代器。

“dict-like”是否有一个精确的定义,如果有,它是什么?它是一个对象x是否可以像字典一样编入索引:x[a],其中a是否可以播放?在这种情况下,一个namedtuple可能不会被视为类似dict,因为你不能使用像x['a']这样的表达式进行索引(最后我检查过你必须写x.a)。但另一方面,namedtuples在功能上与dicts相似,我不知道该怎么想。

讽刺的是,我很想猜测“dict-like”的意思是“一个类似的对象,我的代码会产生相同的答案,就像你提交了一个语义上相同的dict对象一样”。换句话说,“运行函数并自己找出你的论证是否像dict一样!”

更一般地说,是一个类似X的对象,它实现了与X相同的接口?

2 个答案:

答案 0 :(得分:7)

Python使用“duck-typing”:

  

“如果它看起来像鸭子,像鸭子一样嘎嘎叫,它一定是鸭子。”

或许,或许,“如果它看起来像一只鸭子,像鸭子一样嘎嘎叫,它就足够接近一只鸭子来对待它。”显然第一听起来更好。这与"Easier to Ask for Forgiveness than to ask for Permission"的蟒蛇学说密切相关。

类似dict的对象为one which implements (or emulates) the dictionary interface. same concept often comes up for iterables,通常位于numpy for 'array-like' (or 'array_like') objects

答案 1 :(得分:5)

实用鸭子打字:

dict_meths = set(dir({}))

# Python3
class A:
    pass

default_meths = set(dir(A()))

diff = dict_meths - default_meths

现在diff是:

{'__contains__',
 '__delitem__',
 '__getitem__',
 '__iter__',
 '__len__',
 '__setitem__',
 'clear',
 'copy',
 'fromkeys',
 'get',
 'items',
 'keys',
 'pop',
 'popitem',
 'setdefault',
 'update',
 'values'}

当你在类中实现所有这些方法时,你肯定有一个类似dict的对象。如果缺少update之类的一些不太常见的东西,你可能仍然会谈论类似dict的对象。比较file-like objects