Распечатанное сообщение об ошибке объясняет, почему это ошибка типа. Как говорится в программе. Чтобы процитировать соответствующий фрагмент сообщения об ошибке:
File "/home/gaoyunpeng/workspace/main2.py", line 4, in <module>: Invalid type annotation 'T' [invalid-annotation]
Appears only once in the signature
Ошибка использовать TypeVar только один раз в данной сигнатуре, потому что это бессмысленно. В вашем случае вы могли бы просто использовать вместо этого сигнатуру типа def f(x: object) -> None
. Вы хотите сказать, что f
может принимать все, все в Python является подтипом object
.
Вам следует использовать универсальные типы, только если вы хотите, чтобы два или более типа были абсолютно одинаковыми. Например, было бы правильно использовать универсальные типы, если вы хотите определить функцию «identity»:
def identity(x: T) -> T:
return x
Это позволило бы средству проверки типов сделать вывод, что identity("foo")
и identity(4)
имеюттипы str и int соответственно - что возвращаемый тип всегда совпадает с типом параметра.
Обратите внимание, что это правило «всегда следует использовать TypeVar два или более раз на подпись», также верно для методов вобщие классы, а также. Когда вы делаете:
class Foo(Generic[T]):
def test(self, x: T) -> None: pass
... подпись test
на самом деле def test(self: Foo[T], x: T) -> None
. Таким образом, мы неявно всегда также используем TypeVar дважды.