Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Import não funciona e media das avaliações não funciona

Boa tarde, já tinha aberto este forum antes, mas vou refazer de novo,
Como foi dito na aula os arquivos de restaurante.py e avaliacao.py estão na mesma pasta:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

quando eu escrevo no restaurante.py

from modelo.avaliacao import Avaliacao

aparece:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade
porem se eu escrevo:

from .avaliacao import Avaliacao

aparece:
Insira aqui a descrição dessa imagem para ajudar na acessibilidade
e se eu tento executar o app.py da isso:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguem poderia me ajudar com esses dois problemas? Segue o código dos três arquivos para ajudar na verificação

restaurante.py

from .avaliacao import Avaliacao

class Restaurante:
       restaurantes = []

def __init__(self, nome, categoria):
    self._nome = nome.title()
    self.categoria = categoria 
    self._ativo = False
    self._avaliacao = []
    Restaurante.restaurantes.append(self)

def __str__(self):
    return f'{self._nome} | {self.categoria}'

@classmethod
def listar_restaurantes(cls):
    print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliação'.ljust(25)}| {'Status'}')
    for restaurante in cls.restaurantes:
        print(f'{restaurante._nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {restaurante.media_avaliacoes.ljust(25)} | {restaurante.ativo}')
       
@property
def ativo(self):
    return '⌧' if self._ativo else '☐'

def alternar_estado(self):
    self._ativo = not self._ativo

def receber_avaliacao(self, cliente, nota):
    avaliacao = Avaliacao(cliente, nota)
    self._avaliacao.append(avaliacao)

@property
def media_avaliacoes(self):
    if not self._avaliacao:
        return 0
    soma_das_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
    quantidade_de_notas = len(self._avaliacao)
    media = round(soma_das_notas / quantidade_de_notas,1)
    return media

app.py

from modelo.restaurante import Restaurante 

 restaurante_pequin = Restaurante('Pequin', 'Chines')

 restaurante_pequin.receber_avaliacao('Gui',10)
 restaurante_pequin.receber_avaliacao('Mat', 8)
 restaurante_pequin.receber_avaliacao('Sony', 1)

def main():
    Restaurante.listar_restaurantes()

if __name__ == '__main__':
     main()
     

avaliacao.py

  class Avaliacao:
            def __init__(self, cliente, nota):
                  self._cliente = cliente
                  self._nota = nota
2 respostas
solução!

Bom dia, Vitor! Tudo bem?

Primeiro, sobre as importações. Ao rodar o arquivo restaurante.py deu erro porque a importação from modelo.avaliacao import Avaliacao informa que teria outra pasta "modelos" dentro de "modelos" e dentro dessa outra pasta o arquivo avaliacao.py. E no caso da outra importação é o mesmo.

Mas essa importação está correta, já que você não vai rodar restaurante.py ou avaliacao.py mais, sim, app.py e esse arquivo, por estar fora da pasta "modelos" precisa que as importações dos arquivos dentro dela tenham esse contexto de pasta para não causar conflito.

E a título de informação, rodar restaurante.py ou avaliacao.py não vai causar nenhum resultado, eles são arquivos de classe, então não fazem nada até que uma instância dessa classe seja criada, o que é feito em app.py.

Por fim, sobre o erro ao rodar o app.py. Acontece que você está usando o método ljust() no retorno do método media_avaliacoes sem mudar o tipo de media_avaliacoes. Ela vem como float mas o método ljust() só funciona em string. Use a função str() para mudar o tipo:

{str(restaurante.media_avaliacoes).ljust(25)}

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Funcionou, obrigado.