[DUVIDA] - Arquitetura e Designe - Case: Aluno_Aula
Estou criando um projeto simples de estudo em python utilizando FastAPI e me deparei com um problema. O projeto consiste em um cadastro de alunos, classes(aulas) e professores.
Imaginando uma tela de um sistema, o usuario pode listar os alunos, ao clicar no aluno, ele lista as aulas, ao clicar na aula ele lista os alunos matriculados na aula. O mesmo para o professor, ao clicar na aula, ele deve mostrar tbm o professor, e ao clicar no professor ele deve mostrar quais aulas aquele professor ministra.
A forma mais simples que me veio pra fazer me causa um erro de importacao circular.
# aluno.py
from app.aula import Aula
class Aluno:
nome: str
idade: int
periodo: int
aulas: [Aula]
# aula.py
from app.aluno import Aluno
from app.professor import Professor
class Aula:
disciplina: str
professor: Professor
alunos: [Aluno]
Entao possuimos 2 modulos e nesse exemplo ja da pra entender que teremos um erro de importacao circular. Pensei na possibilidade de criar uma outra classe para ter os dados tanto de aluno quanto de aula, assim como seria feito numa tabela N:N, mas por algum motivo essa solucao me incomoda um pouco pq algo me diz q n seria a melhor solucao.
# Solucao inviavel
# aluno_aula.py
from app.aluno import Aluno
from app.aula import Aula
class AlunoAula:
alunos: [Aluno]
aulas: [Aula]
Alguem poderia me ajudar com essa solucao ? ou filosofar comigo sobre o caso ?
Agradeco desde ja.
Python tem um probleminha com importação circular. Você pode dar uma olhada na PEP 484, lá esse erro é discutido.
De grosso modo esse erro ocorre quando você tenta utilizar seus scripts todos no mesmo pacote e realizar importações entre eles.
A solução é mudar a sintaxe da importação, mudar a sintaxe dos type hints, e o mais importante, se você for instanciar alguma das classes, essa classe deve ser instanciada em um módulo separado do pacote.
Veja abaixo:
estrutura
app
__init__.py
aluno_aula.py
aluno.py
aula.py
main.py
aluno.py
from app import aula
class Aluno:
nome: str
idade: int
periodo: int
aulas: list['aula.Aula']
aula.py
from app import aluno
class Aula:
disciplina: str
alunos: list['aluno.Aluno']
aluno_aula.py
from app import aluno, aula
class AlunoAula:
alunos: list['aluno.Aluno']
aulas: list['aula.Aula']
def say_hello(self) -> None:
print('hello')
init.py
# __init__.py
# flake8: noqa
from . aluno_aula import AlunoAula
main.py
from app import AlunoAula
aluno_aula = AlunoAula()
aluno_aula.say_hello()