AttributeError: у объекта 'tuple' нет атрибута 'translate'
Я занимаюсь разработкой этой программы и по какой-то причине все время получаю эту ошибку. Это ошибка, вызванная Ubuntu, или что-то в моем коде, что это приводит к сбою моей программы?
Я обращаюсь к базе данных и пытаюсь удалить из вывода следующие символы: и через value.translate(dictionary_of_bad_characters)
, Вот где я получаю свою ошибку.
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
1 ответ
Эта ошибка указывает на то, что value
это кортеж, а не строка, как вы могли бы ожидать. Это указывает на проблему с вашим приложением.
Здесь проблема в том, что fetchone()
возвращает один кортеж Вы должны изменить из этой строки:
value = results.fetchone()
к этому (обратите внимание на запятую после value
):
value, = results.fetchone()
или это (не рекомендуется):
value = results.fetchone()[0]
Но почему fetchone()
возвращать кортеж вместо строки? Потому что ты можешь SELECT
несколько столбцов. Рассмотрим, например, следующий оператор SQL:
SELECT a, b, c FROM my_table;
В этом случае, fetchone()
вернет тройку.
Пишу value, = fetchone()
вы говорите Python, что вы ожидаете один кортеж, и вы хотите, чтобы этот единственный элемент был помещен в value
, Если бы вы ожидали три кортежа, вы бы использовали column_a, column_b, column_c = resulsts.fetchone()
,
Это причина, почему вы должны предпочесть value,
над fetchone()[0]
,
Бонус: я заметил, что вы используете Python 3. В этом случае вы можете написать:
translation_table = dict.fromkeys(b'+-(),', None)
Ускорение вашего кода и сделать его более чистым.