2
respostas

[Bug] Tudo funciona com exceção do ljust

por algum motivo meu programa não converte a variável para string, apenas isso não funciona. cheguei a copiar e colar mas mesmo assim não foi

from modelos.avaliacao import Avaliacao

class Restaurante:
    restaurantes = []
    
    def __init__(self, nome, categoria):
        self.nome = nome.title()
        self.categoria = categoria.upper()
        self._status = False
        Restaurante.restaurantes.append(self)
        self._avaliacao = []
    
    def __str__(self):
        return f'Restaurante: {self.nome} | Categoria: {self.categoria}'
    
    def listar_restaurantes():
        print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliação'.ljust(25)} | {'Status'} ')
        for restaurante in Restaurante.restaurantes:
            print(f'{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.status} ')

    @property
    def status(self):
        return 'Ativado' if self._status else 'Inativo'
    
    def alternar_status(self):
        self._status = not self._status

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

    @property
    def media_avaliacoes(self):
        if not self._avaliacao:
            return 'Sem Avaliações no momento'
        soma_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
        quantidade_notas = len(self._avaliacao)
        media = round(soma_notas / quantidade_notas, 1)
        return media

não coloquei os outros códigos pq tudo está funcionando

2 respostas

Olá Rafael, como vai?

Isso acontece porque o método ljust é um método de string e não pode ser aplicado diretamente a um número float.

No seu código, você já tentou converter a média das avaliações para string antes de chamar o ljust, que é a solução correta para este problema. Então, o problema deve estar em outra parte do código.

Notei que você está usando a propriedade status no seu método listar_restaurantes. Esta propriedade retorna uma string, então não deveria haver problemas com ela. No entanto, no seu código, você está chamando restaurante.status (sem parênteses), o que na verdade está tentando acessar o método em si, e não o valor que ele retorna.

Isso poderia ser a causa do problema. Tente alterar essa linha para restaurante.status() e veja se isso resolve o problema.

Aqui está como ficaria a linha corrigida:

print(f'{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.status()} ')

Espero ter ajudado!

Caso tenha dúvidas, fico á disposição.

Abraços e bons estudos!

infelizmente não funcionou, apareceu essa mensagem de erro:

PS C:\Users\windows 10\Desktop\OO-sabor-express> & "C:/Users/windows 10/AppData/Local/Programs/Python/Python312/python.exe" "c:/Users/windows 10/Desktop/OO-sabor-express/app.py" Nome do restaurante | Categoria | Avaliação | Status PS C:\Users\windows 10\Desktop\OO-sabor-express> & "C:/Users/windows 10/AppData/Local/Programs/Python/Python312/python.exe" "c:/Users/windows 10/Desktop/OO-sabor-express/app.py" Nome do restaurante | Categoria | Avaliação | Status Traceback (most recent call last): File "c:\Users\windows 10\Desktop\OO-sabor-express\app.py", line 23, in main() File "c:\Users\windows 10\Desktop\OO-sabor-express\app.py", line 20, in main Restaurante.listar_restaurantes() File "c:\Users\windows 10\Desktop\OO-sabor-express\modelos\restaurantes.py", line 19, in listar_restaurantes print(f'{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.status()} ')

                                    ^^^^^^^^^^^^^^^^^^^^

TypeError: 'str' object is not callable PS C:\Users\windows 10\Desktop\OO-sabor-express>

vou colocar as outras partes do código 
from modelos.restaurantes import Restaurante

restaurante_mexicano = Restaurante('5 de mayo', 'mexicano')
restaurante_praca = Restaurante('praça', 'Fast Food')
restaurante_pizza = Restaurante('PIZZA PLACE', 'Pizzaria')
restaurante_japones = Restaurante('Pito Pequeno','Japonês')
restaurante_japones.alternar_status() 
restaurante_japones.receber_avalicao('Away', 5)
restaurante_japones.receber_avalicao('Ícaro', 8)
restaurante_japones.receber_avalicao('Biridin', 7)
restaurante_japones.receber_avalicao('Branca', 9)
restaurante_japones.receber_avalicao('Tigra', 3)
restaurante_japones.receber_avalicao('Pipito', 10)
restaurante_japones.receber_avalicao('Sisay', 10)
restaurante_japones.receber_avalicao('Antonela', 5)
restaurante_japones.receber_avalicao('Vanila', 3)


def main():
    Restaurante.listar_restaurantes()

if  __name__ == '__main__':
    main()
class Avaliacao:
    def __init__(self, cliente, nota):
        self._cliente = cliente
        self._nota = nota
```	
    

from modelos.avaliacao import Avaliacao

class Restaurante: restaurantes = []

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

def __str__(self):
    return f'Restaurante: {self.nome} | Categoria: {self.categoria}'

def listar_restaurantes():
    print(f'{'Nome do restaurante'.ljust(25)} | {'Categoria'.ljust(25)} | {'Avaliação'.ljust(25)} | {'Status'} ')
    for restaurante in Restaurante.restaurantes:
        print(f'{restaurante.nome.ljust(25)} | {restaurante.categoria.ljust(25)} | {str(restaurante.media_avaliacoes).ljust(25)} | {restaurante.status} ')


@property
def status(self):
    return 'Ativado' if self._status else 'Inativo'

def alternar_status(self):
    self._status = not self._status

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

@property
def media_avaliacoes(self):
    if not self._avaliacao:
        return 'Sem Avaliações no momento'
    soma_notas = sum(avaliacao._nota for avaliacao in self._avaliacao)
    quantidade_notas = len(self._avaliacao)
    media = round(soma_notas / quantidade_notas, 1)
    return media
    
    aí estão os 3 códigos, e se eu não uso o ljust todo o resto funciona