6

文档说值视图不被视为 set-like,但有时它们是:

>>> d = {1: 1}
>>> d.values() | d.keys() 
{1}
>>> d.values() & d.keys() 
{1}
>>> d.values() - d.keys() 
set()

为什么要实现集合返回集合语义,但会因实际集合而失败?

>>> d.values() - {1}
TypeError: unsupported operand type(s) for -: 'dict_values' and 'set'
4

1 回答 1

8

这实际上没有dict_values处理操作。将keys_view通过支持反射方法从右手边强力武装操作:

>>> set().__rsub__({}.values())
NotImplemented
>>> {}.keys().__rsub__({}.values())
set()

出于类似的原因,set 操作有时会与其他 dict 视图一起工作或不工作:

# works, because type(d.items()) implements __rsub__
>>> d.values() - d.items()  
{1}

# fails, because type(d.values()) does not implement __rsub__
>>> d.values() - d.values()
TypeError: unsupported operand type(s) for -: 'dict_values' and 'dict_values'

因此,尽管这种行为似乎违反了鸭式打字,但文档仍然正确。

于 2019-05-01T17:19:50.070 回答