Dica de tipo em Python sem importações cíclicas
Em uma tentativa de dividir uma classe grande em duas menores, você encontra o problema de cíclica importações. A classe "principal" importa a classe mixin, e a classe mixin faz referência à classe "principal" em sua dica de tipo. Isso resulta em um ciclo de importação, impedindo que a sugestão de tipo funcione corretamente.
Para resolver isso, você pode considerar a seguinte abordagem:
# main.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from mixin import MyMixin
class Main(object):
def func1(self, xxx: Any):
...
# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self: Main, xxx: Any):
...
Neste exemplo, a constante TYPE_CHECKING do Python é usada para importar condicionalmente a classe "principal". Ao executar o código, a instrução de importação é ignorada porque a constante é False. No entanto, ferramentas de verificação de tipo como mypy interpretam o código dentro do bloco if TYPE_CHECKING e reconhecem a anotação de tipo para func2.
Outra abordagem envolve o uso de uma referência direta:
# mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self, xxx: 'Main'):
...
Aqui, a anotação de tipo para func2 é uma string que representa o nome da classe que será importada posteriormente. Ambas as abordagens requerem o uso de Python 3.7 ou superior para funcionar de forma eficaz com dicas de tipo.
Lembre-se de que o uso de mixins e dicas de tipo pode exigir estruturação adicional em seu código. Por exemplo, mypy recomenda a criação de uma classe base abstrata (ABC) da qual as classes "principal" e mixin herdam. Isso pode melhorar a precisão da verificação de tipo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3