反转字典并在 python 中访问其值的正确方法是什么?

What is the correct way to reverse dict and access its values in python?

虽然下面的代码完美地打印出 cba mypy 抱怨它。

main.py:10: error: No overload variant of "reversed" matches argument types [typing.ValuesView[builtins.str*]]

以相反顺序遍历 x 并获取值的正确方法是什么?

from collections import OrderedDict

def main() -> None:
    x = OrderedDict([
        (1, 'a'),
        (2, 'b'),
        (3, 'c'),
    ])

    for y in reversed(x.values()):
        print(y)


if __name__ == '__main__':
    main()

虽然它适用于 Python 3.6,但在 Python 3 的早期版本上,您的代码不起作用。在 python 3.4:

TypeError: argument to reversed() must be a sequence

(与dict.values()的类型有关)

一种解决方法是先转换为 list,但这很浪费。

for y in reversed(list(x.values())):
    print(y)

mypy 还没有意识到这种新颖性并发出错误。

您应该忽略该错误。我没有尝试过,但也许用 # type: ignore 评论可行(在 https://github.com/python/mypy/issues/500 中讨论):

for y in reversed(list(x.values())):  # type: ignore

这是因为 OrderedDict 字典视图确实实现了 __reversed__ 但没有继承自 collections.abc.Reversible(值视图确实继承自 collections.abc.ValuesView)。

这可以通过在 Python 标准库中添加基础 class 和更新 Python Typeshed definition. I've filed an issue with the latter 来修复,因为这是获得修复的更快方法。

您可以克隆我的 pull-request 分支以在本地获取新定义,然后使用 --custom-typeshed-dir 切换到 mypy 以在编译到 mypy 本身的分支上使用它:

git clone https://github.com/mjpieters/typeshed.git \
    --branch ordereddict_views_reversible \
    ~/typeshed_ordereddict_views_reversible   # or a different location
mypy --custom-typeshed-dir ~/typeshed_ordereddict_views_reversible <yourproject>