AttributeError: o objeto 'tuple' não possui atributo 'translate'

5

Estou desenvolvendo este programa e, por algum motivo, continuo recebendo esse erro. Isso é um erro causado pelo Ubuntu, ou algo no meu código que está causando problemas no meu programa?

Estou acessando um banco de dados e tentando remover os seguintes caracteres da saída: e, via value.translate(dictionary_of_bad_characters) . É aí que recebo o meu erro.

def get_data(plu):          # Get the data needed
    global value            # Set the variable value to global

    conn = sqlite3.connect('plus.sqlite')   # Connect to the sqlite3 database

    cursor = conn.cursor()  # Set cursor as the cursor for plus.sqlite

    results = cursor.execute('SELECT value FROM plus WHERE plu=?', [plu])
    # Above code gets the data value for value with the PLU of plu

    value = results.fetchone()            # Get the results of value

    data = [row[0] for row in results.fetchall()]

    translation_table = dict.fromkeys(map(ord, '+-(),'), None)
    # Above code creates a table with the mapped characters

    value = value.translate(translation_table)
    # Above code removes any unnescessary characters from value

    response = {    'PLU':      plu,
                    'Value':    value
                    }       # Create the response variable

    value = int(value)      # Convert value to type integer

    cursor.close()          # Close the cursor
    conn.close()            # Close the connection

    return(value)           # Return to the program flow
    
por RPi Awesomeness 07.05.2013 / 19:56

1 resposta

7

Esse erro indica que value é uma tupla e não uma string como você poderia esperar. Isso indica um problema com seu aplicativo.

Aqui, o problema é que fetchone() retorna uma tupla. Você deve mudar desta linha:

value = results.fetchone()

para isso (observe a vírgula após value ):

value, = results.fetchone()

ou isto (não recomendado):

value = results.fetchone()[0]

Mas por que fetchone() está retornando uma tupla em vez de uma string? Porque você pode SELECT de várias colunas. Considere, por exemplo, a seguinte instrução SQL:

SELECT a, b, c FROM my_table;

Nesse caso, fetchone() retornará uma tupla de três.

Escrevendo value, = fetchone() você está dizendo ao Python que você está esperando uma tupla e deseja que o único item seja colocado em value . Se você estivesse esperando a tupla de três, você teria usado column_a, column_b, column_c = resulsts.fetchone() .

Esta é a razão pela qual você deve preferir value, over fetchone()[0] .

Dica de bônus: notei que você está usando o Python 3. Nesse caso, você pode escrever:

translation_table = dict.fromkeys(b'+-(),', None)

Acelerando seu código e tornando-o mais limpo.

    
por Andrea Corbellini 07.05.2013 / 20:04

Tags