¿Por qué un código como `str = str(…)` causa un TypeError, pero solo la segunda vez?

4 minutos de lectura

avatar de usuario
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?.

  • 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

avatar de usuario
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

avatar de usuario
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

avatar de usuario
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.

avatar de usuario
chikitin

Cada vez que eso suceda, simplemente emita lo siguiente (también se publicó anteriormente)

>>> del str

Eso debería arreglarlo.

avatar de usuario
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

¿Ha sido útil esta solución?