2011-05-18 19 views
39

Código:TypeError: objeto 'str' no es exigible (Python)

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' 

Los primeros Dict(z, 'w') obras y después de la segunda vez que se le ocurre un error:

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 

¿Alguien sabe a que se debe esto?

@ Greg Hewgill:

ya he intentado eso y me sale el error:

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 
+4

Cambie el nombre de TODAS las instancias de su variable 'str', incluida la de la línea 53 de la que ese error se está quejando. –

Respuesta

79

Este es el problema:

global str 

str = str(mar) 

Usted está redefiniendo lo str() medios. str es el nombre de Python incorporado del tipo de cadena y no desea cambiarlo.

Utilice un nombre diferente para la variable local y elimine la instrucción global.

+6

no está destinado a ser utilizado, pero alternativamente, la función 'str()' también está disponible como '__builtins__. Str()'. Por supuesto, es una mala idea usar eso en el 99.9999% de los casos, supongo. – n611x007

+0

Recuerda que necesitarás reiniciar el kernel de python para obtener la funcionalidad 'str()'. – yeliabsalohcin

85

Aunque no está en su código, otro error difícil de punto es cuando el personaje % no se encuentra en un intento de formateo de cadenas:

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

pero debería ser:

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

La falta de % daría como resultado el mismo TypeError: 'str' object is not callable.

+4

¡Gracias señor! Error simple pero muy afectado para arruinar una secuencia de comandos. – ChrisR

+0

Sé que esto es muy viejo, pero acabo de tener este problema y esta respuesta me ayudó, gracias @naxa – Bbit

+0

Esto me acaba de salvar después de una hora de resolución de problemas. ¡Gracias! – Michael

12

En mi caso tenía una clase que tenía un método y una propiedad de cadena con el mismo nombre, estaba intentando llamar al método pero obtenía la propiedad de cadena.

4

Otro caso de esto: jugando con la función __repr__ de un objeto donde una llamada format() falla de forma no transparente.

En nuestro caso, utilizamos un decorador @property en el __repr__ y pasamos ese objeto a format(). El decorador @property hace que el objeto __repr__ se convierta en una cadena, lo que hace que el objeto str no sea un error invocable.

+1

Gracias, este también fue el problema para mí (no estaba usando el formato, pero por alguna razón había una @propiedad en '__repr__') – Justin

+0

Esta solución debería ser realmente mucho más. –

0

Tuve el mismo error. En mi caso no fue debido a una variable llamada str. Pero porque he nombrado una función con un parámetro str y la variable es la misma.

same_name = same_name (var_name: str).

Lo manejo en un bucle. La primera vez que se ejecuta bien. La segunda vez que tengo este error. El cambio de nombre de la variable a un nombre diferente del nombre de la función lo solucionó. Así que creo que es porque Python una vez asocia un nombre de función en un ámbito, la segunda vez intenta asociar la parte izquierda (same_name =) como una llamada a la función y detecta que el parámetro str no está presente, por lo que falta, entonces arroja ese error.

-1

En mi caso, tenía una clase con un método.El método no tenía 'self' como el primer parámetro y el error se lanzaba cuando hice una llamada al método. Una vez que agregué 'self' a la lista de parámetros del método, estaba bien.

2

Puede obtener este error si tiene la variable str e intenta llamar a la función str().

0

Un problema que sólo tenía estaba llamando accidentalmente una cadena

"Foo" ("Bar" if bar else "Baz") 

Puede concatenar cadena, con solo colocar uno al lado del otro como tal

"Foo" "Bar" 

Sin embargo, debido a la llave de apertura en el primer ejemplo que pensó que estaba tratando de llamar "Foo"

0

podría ser también que está tratando de indexar de la manera incorrecta:

a = 'apple' 
a(3) ===> 'str' object is not callable 

a[3] = l 
Cuestiones relacionadas