Aula 10 Debugging

Jacques Wainer

2024

Debugging

Considere o seguinte programa:

import matplotlib.pyplot as plt
from collections import Counter
import string

def plot_frequency(string):
    string = string.lower()
    string = string.translate(str.maketrans('', '', string.punctuation + string.whitespace))
    letter_counts = Counter(string)
    sorted_letter_counts = sorted(letter_counts.items(), key=lambda x: x[1], reverse=True)
    letters = [item[0] for item in sorted_letter_counts]
    counts = [item[1] for item in sorted_letter_counts]
    # Plotando o gráfico de barras
    plt.bar(letters, counts)
    plt.xlabel('Letras')
    plt.ylabel('Frequência')
    plt.title('Frequência de Letras (Ordenado)')
    plt.show()
    

Eu recebi a seguinte mensagem de erro: “AttributeError: ‘str’ object has no attribute ‘punctuation’”

O erro ocorre porque a função punctuation não pertence diretamente a uma string. Ela é parte do módulo string, então você precisa acessá-la através do módulo. Para corrigir isso, você pode modificar a linha que usa punctuation da seguinte forma:

string = string.translate(str.maketrans('', '', string.punctuation + string.whitespace))

Para isso, você precisa importar o módulo string no início do seu código, juntamente com matplotlib e Counter:

import matplotlib.pyplot as plt
from collections import Counter
import string

Continuou dando o mesmo erro: ‘AttributeError: ’str’ object has no attribute ‘punctuation’’

Peço desculpas pela confusão anterior. O erro ocorre porque a variável string está sendo usada como o nome do parâmetro da função e também como o nome do módulo string, o que causa a confusão. Para corrigir isso, você pode renomear o parâmetro da função para algo diferente de string, como input_string, por exemplo. Aqui está o código corrigido:


import matplotlib.pyplot as plt
from collections import Counter
import string as str

def plot_frequency(input_string):
    input_string = input_string.lower()
    translator = str.maketrans('', '', str.punctuation + str.whitespace)
    input_string = input_string.translate(translator)
    ....
    

O que aconteceu é que o parametro da função se chamada string e o pacote se chama string e a função usa string.punctuation + string.whitespace Que string é esse? o parametro ou o pacote.

Veja que ele exagerou na solucao, trocou o nome do pacote para str e trocou o nome do parametro para input_string

Mas isso nao funciona tambem.

Agora eu estou recebendo o erro “AttributeError: module ‘string’ has no attribute ‘maketrans’”

O erro ocorre porque o método maketrans não está sendo importado corretamente. Parece que há um conflito de nomes entre o módulo string e a função string utilizada no código. Para corrigir isso, você pode importar apenas a função maketrans do módulo str e utilizá-la diretamente. Aqui está o código corrigido:

import matplotlib.pyplot as plt
from collections import Counter
from string import punctuation, whitespace, maketrans

def plot_frequency(input_string):
    input_string = input_string.lower()
    translator = maketrans('', '', punctuation + whitespace)
    input_string = input_string.translate(translator)
    ...

agora estou recebendo o erro “ImportError: cannot import name ‘maketrans’ from ‘string’”

Peço desculpas pela confusão anterior. Parece que houve um erro na minha explicação. O método maketrans não está mais disponível no módulo string no Python 3. Em vez disso, você pode usar a função str.maketrans para criar a tabela de tradução. Aqui está o código corrigido:


import matplotlib.pyplot as plt
from collections import Counter
import string

def plot_frequency(input_string):
    input_string = input_string.lower()
    translator = str.maketrans('', '', string.punctuation + string.whitespace)
    input_string = input_string.translate(translator)
    ...
    

Agora funcionou

Tipo sanguineo

Escreva uma funcao que dado o tipo sanguineo do pai, da mae e de uma crianca, retorna True se o a crianca pode ser filho do casal tendo em vista o tipo sanguineo

pode dar ou nao certo