Executando verificação de segurança...
3

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()
1

Entendi, massa, mas acho q expressei mal a minha duvida, ateh alterei tanto o titulo quanto um pouco do contedo do post.
Meu problema real nao eh tanto a importacao circular em si, mas a arquitetura para q eu consiga manter o comportamento esperado sem ter o problema de importacao circular ou de espelhar as classes como se fossem tabelas do banco de dados.

2

Olá.
Acredito que você possa procurar no domínio alguma entidade que representante essa relação de forma mais sólida.
Algo como uma Turma ou uma Classe que (essas sim) possuem aulas e alunos. Dessa forma você consegue enriquecer o modelo futuramente em caso de necessidade, com horário por exemplo.

1

Soh pra ver se eu entendir, aii nesse caso entao eu teria uma Turma, essa turma teria uma lista de alunos e uma lista de disciplinas pra esses alunos ?

from app.aluno import Aluno
from app.aula import Aula

class Turma:
    alunos: [Aluno]
    disciplinas: [Aula]

Isso ?
Pensando nesse caso, eu acredito q mataria o problema da importacao circular.
Manteria o comportamento esperado do sistema.

Mas minha duvida nesse caso(falo como leigo msm, n to e nem tenho muita propriedade pra dizer q esta errado), mas ter uma classe Turma q faz o intermedio entre aluno e aula n seria o mesmo q ter uma tabela Aluno x Aula, digo em algum lugar eu li q nao eh mais usual desenvolver sistemas q espelhem a arquitetura de um banco de dados, ateh pq a forma de arquitetar um banco SQL seria diferente de um noSQL.
Sendo assim, eu to tentando entender uma forma q fuja da arquitetura do banco de dados em si.

Na vdd no fundo eu me pergunto se tem uma forma de fazer o desenvolvimento de forma concisa que n precise de uma classe Turma para unir aluno e aula.

Agradeco muito pela tua resposta, nesse primeiro momento eu vou desenvolver com a ideia q tu me passou, e como eh um caso apenas de estudo, eu vou alterando a medida q adquiro mais conhecimento.
Vlw guri =]

2

Você ter uma classe (ou conceito) de turma nao é espelhar o banco de dados, mas sim o dominio do negócio da aplicação.
Quando puder dá uma olhada em Domain Driven Design e linguagem ubiqua.
Pode te ajudar a tomar decisões de arquitetura.

1

Me incomoda pq essa solucao me parece muito com a forma ao qual seria feita em um banco de dados.

tabela aluno
tabela aula
tabela turma(aula x aluno)

Esse conceito do sistema ser construido semelhante ao banco de dados ta me pegando, digo n por estar errado ou gerar algum erro, ateh pq minhas experiencias com desenvolvimento visam o banco de dados como o alicerce e o sistema ser construido a partir da da base, tendo classes espelhadas com as tabelas do banco.
Mas recentemente li q essa abordagem de cosntrucao de sistemas nao eh mais tao usual, pq hj podemos ter sistemas com bancos SQL e noSQL sendo assim essa abordagem cai por terra.
Foi aii q comecei com esse projeto, algo simples mas q de alguma forma eu consiga entender esse novo conceito(novo pra mim na real).

Soh q faz um certo tempo q eu to empacado nisso, aii resolvi postar aqui.

2

Tranquilo.
Desculpe, acabei alterando minha resposta e a sua pareceu fora de contexto, mas entendi o que você disse.
Dependendo da aplicação modelar a aplicação baseado no banco de dados não é uma boa solução. Você criar classes artificiais (que não seguem o dominio) apenas para relacionar dados trás uma complexidade desnecessária.
Mas existem classes e classes.
Na dúvida revisita o domínio e verifica se ele já nao possui algo para identificar essa relação.

1
1

Hummmmm
Entendi, massa, vou dar uma olhada sim, pq agora q vc comentou sobre o dominio, pode ser q eu esteja confuso com o conceito de fato.
Nao qrendo abusar massss, tem algum material que vc indicaria ou algum livro q trate bem dos assuntos ?

1

Dá uma lida nesse artigo bem introdutório para te ajudar a entender os conceitos
https://www.locaweb.com.br/blog/temas/codigo-aberto/ddd-entenda-o-domain-driven-design/

Procura pelo Livro "Domain Driven Design - atacando a complexidade no coração do software". É a melhor fonte sobre o assunto, mas é bem..."denso" de informação o que torna a leitura um pouco cansativa, mas vale a pena.

Fiz uma pesquisa rapida e achei esse cara aqui https://dddinpython.com/ que oode ser útil baseado no seu exemplo.