Estou tentando atribuir uma variável a uma instância de uma classe de forma que a variável seja do mesmo tipo. Quero usar a própria instância na construção da variável. Para ser compatÃvel com herança, quero usar a sugestão de tipo como, Self
em vez da classe.
As seguintes obras:
class Foo:
var: "Foo"
def bar(self) -> None:
self.var = self
No entanto, var
está marcado como sendo do tipo , Foo
em vez de Self
. O que eu quero é:
from typing import Self
class Foo:
var: Self
def bar(self) -> None:
self.var = self
Neste caso, o mypy me dá a seguinte mensagem:
error: Incompatible types in assignment (expression has type "Foo", variable has type "Self") [assignment]
Claramente, self
não é considerado como sendo do tipo, Self
mas somente do tipo Foo
.
PEP 673 (ref https://peps.python.org/pep-0673/ ) introduzido
typing.Self
no Python 3.11 para permitir que você escreva:para que em subclasses
clone()
seja reconhecido como retornando o tipo da subclasse. Mas, no momento, mypy só aceita casos especiaisSelf
em assinaturas de métodos , não em anotações de atributos no nÃvel de classe. Então, quando você escreve:O mypy ainda trata
Self
invar: Self
como "a classe atual" (ou seja,Foo
) e reclama quando você atribuiself
(o que ele digita comoFoo
) a algo que ele considera serSelf
(o tipo desconhecido de ligação tardia). É essencialmente um bug/limitação no tratamento de anotações de atributos de ligação tardia pelo mypy.O PEP tem exemplos usando TypeVar. Sugiro combinar isso com genérico para criar uma solução alternativa.
Por exemplo,
Alternativamente, se você quiser uma "solução rápida", basta anotar var com o nome da classe, como você já fez no seu OP.