P’sao
Tengo un código como:
def example(parameter):
global str
str = str(parameter)
print(str)
example(1)
example(2)
La primera llamada a example
funciona, pero luego, la segunda vez, aparece un error como:
Traceback (most recent call last):
File "test.py", line 7, in <module>
example(2)
File "test.py", line 3, in example
str = str(parameter)
TypeError: 'str' object is not callable
¿Por qué sucede esto y cómo puedo solucionarlo?
Si está en una sesión interactiva y encontró un problema como este, y desea solucionar el problema sin reiniciar el intérprete, consulte ¿Cómo restaurar una función integrada que sobrescribí por accidente?.
greg hewgill
Donde dice el codigo:
global str
str = str(parameter)
Estás redefiniendo lo que str()
medio. str
es el nombre integrado de Python del tipo de cadena y no desea cambiarlo.
Use un nombre diferente para la variable local y elimine el global
declaración.
Tenga en cuenta que si usó un código como este en Python REPL, entonces la asignación al global str
persistirá hasta que hagas algo al respecto. Puede reiniciar el intérprete, o del str
. Este último funciona porque str
es no en realidad es una variable global definida de forma predeterminada; en cambio, normalmente se encuentra en un respaldo (el builtins
módulo de biblioteca estándar, que se importa especialmente al inicio y recibe el nombre global __builtins__
).
-
no está destinado a ser utilizado, pero alternativamente, el
str()
La función también está disponible como__builtins__.str()
. Por supuesto, es una mala idea usar eso en el 99.9999% de los casos, supongo.– n611x007
26/09/2013 a las 20:23
-
En el código original, el
global
declaración fue necesaria para evitar un problema diferente. Después del cambio de nombre, es inútil, pero no directamente dañino.– Karl Knechtel
24 de julio a las 19:58
n611x007
Si bien no está en su código, otro error difícil de detectar es cuando el %
falta el carácter en un intento de formato de cadena:
"foo %s bar %s coffee"("blah","asdf")
pero debería ser:
"foo %s bar %s coffee"%("blah","asdf")
Los desaparecidos %
daría como resultado lo mismo TypeError: 'str' object is not callable
.
-
Tener una propiedad y un método con el mismo nombre, sobrescribir el método con una cadena y luego intentar ejecutar ese método/cadena también dio TypeError: el objeto ‘str’ no se puede llamar
– Puggan Se
28 de junio de 2020 a las 23:38
En mi caso, tenía una clase que tenía un método y una propiedad de cadena del mismo nombre, estaba tratando de llamar al método pero obtenía la propiedad de cadena.
-
podría ser bueno tener el remedo registrado y algo así como un modo estricto que provoque un RuntimeWarning de algún tipo cuando esto suceda, pero eh; es Python totalmente válido para reemplazar un atributo con un método y viceversa por la especificación
– ThorSummoner
23 de julio de 2020 a las 0:04
Alexander H Stebner
Tenga en cuenta que TypeError: 'str' object is not callable
significa sólo que hay un intento de llamar (es decir, usar la sintaxis de llamada de función) una cadena (es decir, cualquier nombre que previamente tenía una cadena asignada). El uso de cualquier otro método incorporado como nombre de variable puede generar exactamente el mismo mensaje de error.
Puede obtener este error si tiene variable str
y tratando de llamar str()
función.
chikitin
Cada vez que eso suceda, simplemente emita lo siguiente (también se publicó anteriormente)
>>> del str
Eso debería arreglarlo.
Luciano
Otro caso de esto: Jugando con el __repr__
función de un objeto donde un format()
la llamada falla de manera no transparente.
En nuestro caso, utilizamos un @property
decorador en el __repr__
y pasó ese objeto a un format()
. los @property
decorador provoca el __repr__
objeto para ser convertido en una cadena, que luego da como resultado el str
el objeto no es un error invocable.
-
Es difícil entender la situación descrita. Agregue un ejemplo reproducible mínimo a la respuesta.
– Karl Knechtel
hace 2 días
Edité la pregunta significativamente para producir un ejemplo reproducible mínimo adecuado: originalmente había un lote de código irrelevante para la pregunta (que no se consideró en ninguna respuesta, y cualquier otro problema allí haría que la pregunta careciera del enfoque adecuado). También eliminé una respuesta de seguimiento relacionada con el código original exacto y precisamente cómo solucionarlo en contexto, porque esto es no es un foro de discusión.
– Karl Knechtel
24 de julio a las 19:54
Esta pregunta se ha convertido en un canónico útil, así que quiero que se vea lo mejor posible. Si bien se preguntó originalmente hace 11 años, me gustaría ofrecer un recordatorio amable a todos para que intenten rastrear y comprender los problemas antes de publicar.
– Karl Knechtel
24 de julio a las 19:55