反转字典并在 python 中访问其值的正确方法是什么?
What is the correct way to reverse dict and access its values in python?
虽然下面的代码完美地打印出 c
,b
,a
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>
虽然下面的代码完美地打印出 c
,b
,a
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>