何时可以将dict_values视图设置为set(为什么)?

wim*_*wim 6 python dictionary set python-datamodel

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

>>> d = {1: 1}
>>> d.values() | d.keys() 
{1}
>>> d.values() & d.keys() 
{1}
>>> d.values() - d.keys() 
set()
Run Code Online (Sandbox Code Playgroud)

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

>>> d.values() - {1}
TypeError: unsupported operand type(s) for -: 'dict_values' and 'set'
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 8

实际上,这不是在dict_values处理操作。在keys_view从右手侧将强臂的操作时,通过支持反射的方法(或多个):

>>> set().__rsub__({}.values())
NotImplemented
>>> {}.keys().__rsub__({}.values())
set()
Run Code Online (Sandbox Code Playgroud)

出于类似的原因,设置操作有时会与其他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'
Run Code Online (Sandbox Code Playgroud)

因此,尽管此行为似乎违反了鸭子输入法,但文档仍然正确。