web-dev-qa-db-fra.com

Comment puis-je corriger cette erreur "TypeError: 'str' object is not callable"?

Je crée un programme de base qui utilisera une interface graphique pour obtenir le prix d'un article, puis 10% de réduction sur le prix si le prix initial est inférieur à 10 ou 20% sur le prix si le prix initial est supérieur à dix:

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))

Je reçois toujours cette erreur:

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

Pourquoi ai-je cette erreur?

12
user2443381

Vous essayez d'utiliser la chaîne en tant que fonction:

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

Parce qu'il n'y a rien entre le littéral de chaîne et la parenthèse (..), Python interprète cela comme une instruction pour traiter la chaîne comme un appelable et l'invoquer avec un argument:

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

Il semble que vous ayez oublié de concaténer (et d'appeler str()):

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

La ligne suivante doit également être corrigée:

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

Vous pouvez également utiliser la mise en forme des chaînes avec 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} sera remplacé par votre calcul de prix, formatant la valeur à virgule flottante en valeur à 2 décimales.

21
Martijn Pieters