Как я могу исправить эту ошибку "TypeError: 'str' не вызываемый"?

Я создаю базовую программу, которая будет использовать графический интерфейс для получения цены товара, а затем возьмите 10% от цены, если начальная цена будет меньше 10 или займет 20% от цены, если начальная цена больше десяти:

import easygui
price=easygui.enterbox("What is the price of the item?")
if float(price) < 10:
    easygui.msgbox("Your new price is: $"(float(price) * 0.1))
elif float(price) > 10:
    easygui.msgbox("Your new price is: $"(float(price) * 0.2))

Я продолжаю получать эту ошибку:

easygui.msgbox("Your new price is: $"(float(price) * 0.1))
TypeError: 'str' object is not callable`

Почему я получаю эту ошибку?

Ответ 1

Вы пытаетесь использовать строку как функцию:

"Your new price is: $"(float(price) * 0.1)

Поскольку между строковым литералом и скобкой (..) нет ничего, Python интерпретирует это как инструкцию для обработки строки как вызываемой и вызывает ее с одним аргументом:

>>> "Hello World!"(42)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

Кажется, вы забыли объединиться (и назовите str()):

easygui.msgbox("Your new price is: $" + str(float(price) * 0.1))

Следующая строка также нуждается в фиксации:

easygui.msgbox("Your new price is: $" + str(float(price) * 0.2))

В качестве альтернативы используйте форматирование строк с помощью str.format():

easygui.msgbox("Your new price is: ${:.2f}".format(float(price) * 0.1))
easygui.msgbox("Your new price is: ${:.2f}".format(float(price) * 0.2))

где {:02.2f} будет заменено вашим ценовым расчетом, форматируя значение с плавающей запятой в качестве значения с двумя десятичными знаками.