偶尔人们会在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相同的接口?
答案 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。