103 votes

TypeError : l'objet 'str' n'est pas appelable (Python)

Code :

import urllib2 as u
import os as o
inn = 'dword.txt'
w = open(inn)
z = w.readline()
b = w.readline()
c = w.readline()
x = w.readline()
m = w.readline()
def Dict(Let, Mod):
    global str
    inn = 'dword.txt'
    den = 'definitions.txt'

    print 'reading definitions...'

    dell =open(den, 'w')

    print 'getting source code...'
    f = u.urlopen('http://dictionary.reference.com/browse/' + Let)
    a = f.read(800)

    print 'writing source code to file...'
    f = open("dic1.txt", "w")
    f.write(a)
    f.close()

    j = open('defs.txt', 'w')

    print 'finding definition is source code'
    for line in open("dic1.txt"):
        if '<meta name="description" content=' in line:
           j.write(line)

    j.close()

    te = open('defs.txt', 'r').read().split()
    sto = open('remove.txt', 'r').read().split()

    print 'skimming down the definition...'
    mar = []
    for t in te:
        if t.lower() in sto:
            mar.append('')
        else: 
            mar.append(t)
    print mar
    str = str(mar)
    str = ''.join([ c for c in str if c not in (",", "'", '[', ']', '')])

    defin = open(den, Mod)
    defin.write(str)
    defin.write('                 ')
    defin.close()

    print 'cleaning up...'
    o.system('del dic1.txt')
    o.system('del defs.txt')
Dict(z, 'w')
Dict(b, 'a')
Dict(c, 'a')
Dict(x, 'a')
Dict(m, 'a')
print 'all of the definitions are in definitions.txt'

Le premier Dict(z, 'w') fonctionne, puis la deuxième fois, il y a une erreur :

Traceback (most recent call last):
  File "C:\Users\test.py", line 64, in <module>
    Dict(b, 'a')
  File "C:\Users\test.py", line 52, in Dict
    str = str(mar)
TypeError: 'str' object is not callable

Quelqu'un sait-il pourquoi ?

@Greg Hewgill :

J'ai déjà essayé et j'obtiens l'erreur :

Traceback (most recent call last):
 File "C:\Users\test.py", line 63, in <module>
    Dict(z, 'w')
  File "C:\Users\test.py", line 53, in Dict
   strr = ''.join([ c for c in str if c not in (",", "'", '[', ']', '')])
TypeError: 'type' object is not iterable

6 votes

Renommez TOUTES les instances de votre str y compris celle de la ligne 53 qui fait l'objet de l'erreur.

162voto

Greg Hewgill Points 356191

C'est là le problème :

global str

str = str(mar)

Vous redéfinissez ce que str() signifie. str est le nom Python intégré du type de chaîne, et vous ne voulez pas le changer.

Utilisez un nom différent pour la variable locale, et supprimez la balise global déclaration.

7 votes

N'est pas censée être utilisée, mais alternativement, l'option str() est également disponible en tant que __builtins__.str() . Bien sûr, c'est une mauvaise idée de l'utiliser dans 99,9999 % des cas, je suppose.

3 votes

Rappelez-vous que vous devrez redémarrer le noyau python pour obtenir str() la fonctionnalité est revenue.

6 votes

@yeliabsalohcin, tu peux juste del str si vous l'avez accidentellement écrasé et la fonctionnalité intégrée sera restaurée.

121voto

naxa Points 1185

Bien que ce ne soit pas dans votre code, une autre erreur difficile à repérer est celle où la fonction % est manquant dans une tentative de formatage de chaîne de caractères :

"foo %s bar %s coffee"("blah","asdf")

mais ça devrait l'être :

"foo %s bar %s coffee"%("blah","asdf")

La disparition % aurait pour résultat le même TypeError: 'str' object is not callable .

6 votes

Merci Monsieur ! Erreur simple mais grandement affectée pour ruiner un script.

0 votes

Je sais que c'est vraiment vieux, mais je viens d'avoir ce problème et cette réponse m'a aidé, merci @naxa.

0 votes

Cela vient de me sauver après une heure de dépannage. Merci !

26voto

ThorSummoner Points 396

Dans mon cas, j'avais une classe qui avait une méthode et une propriété de type chaîne de caractères du même nom. J'essayais d'appeler la méthode mais je recevais la propriété de type chaîne de caractères.

0 votes

Merci - débogage d'un certain code et d'une légitime avait un @propriété annotation que je n'avais pas remarquée, votre réponse m'a permis de la voir.

1 votes

Il serait bien d'avoir un enregistrement de l'ombrage et quelque chose comme un mode strict provoquant un RuntimeWarning quelconque lorsque cela se produit, mais eh ; il est tout à fait valide en Python de remplacer un attribut par une méthode et vice versa par la spécification.

26voto

Il est important de noter (au cas où vous seriez venu ici par Google) que TypeError : 'str' object is not callable". "signifie seulement qu'une variable qui a été déclarée comme étant de type String précédemment est tentée d'être utilisée comme une fonction (par exemple en ajoutant des paranthèses à la fin).

Vous pouvez obtenir exactement le même message d'erreur si vous utilisez une autre méthode intégrée comme nom de variable.

19voto

Altaveron Points 3002

Vous pouvez obtenir cette erreur si vous avez une variable str et essayant d'appeler str() fonction.

0 votes

Merci pour cette réponse en "anglais clair", très utile pour ce n00b en python ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X