【问题标题】:When can dict_values views be set-like (and why)?dict_values 视图何时可以设置为类似(以及为什么)?
【发布时间】:2019-09-20 05:49:06
【问题描述】:

文档说values views are not treated as 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'

【问题讨论】:

    标签: python dictionary set python-datamodel


    【解决方案1】:

    这实际上不是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'
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2015-03-26
      • 2023-04-06
      • 2015-07-24
      • 1970-01-01
      • 2011-01-05
      • 2013-03-06
      相关资源
      最近更新 更多