Как правильно аннотировать тип для operator.gt?

У меня есть следующий фрагмент кода:

from typing import List
import operator


class A:

    def __init__(self, x: int) -> None:
        self.x = x

    def __gt__(self, other: "A") -> int:
        return 0 if self.x > other.x else -1


lst: List[A] = []
sorted(lst, key=operator.gt)

Теперь проблема в том, что mypy будет жаловаться на:

Аргумент "ключ" к "отсортированному" имеет несовместимый тип "Callable[[Any, Any], Any]"; ожидается "Необязательный [Вызываемый [[A], Любой]]"

Где я предполагаю, что operator.gt был явно так аннотирован.

Мой вопрос в том, как я могу аннотировать таким образом, чтобы также было ясно, что lst является List[A], и что mypy не будет жаловаться на operator.gt?


person andreihondrari    schedule 10.05.2019    source источник


Ответы (1)


Это не имеет ничего общего с mypy и все с сигнатурой key и operator.gt: оператор принимает два аргумента (две вещи для сравнения), тогда как key принимает один аргумент для преобразования элементов.

Другими словами: проблема не в A против Any, а скорее в [foo] против [foo, foo].

Чего вы пытаетесь достичь с помощью этой ключевой функции?

person L3viathan    schedule 10.05.2019
comment
А, понятно, я неправильно использовал operator.gt. Думаю, поэтому подсказки типов хороши. - person andreihondrari; 11.05.2019