Как правильно отменить dict и получить доступ к его значениям в python? - PullRequest
0 голосов
/ 25 апреля 2018

Хотя следующий код прекрасно печатает 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()

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Это связано с тем, что OrderedDict представления словаря реализуют __reversed__, но не наследуют от collections.abc.Reversible (представление значений наследует от collections.abc.ValuesView).

Это можно исправить как добавлением этого базового класса в стандартную библиотеку Python, так и обновлением определения Python Typeshed . Я сообщил о проблеме с последним , так как это более быстрый способ получить исправление.

Вы можете клонировать мою ветку 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>
0 голосов
/ 25 апреля 2018

Хотя он работает на Python 3.6, в предыдущих версиях Python 3 ваш код не работает.на питоне 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
...