Вопрос-Ответ

Why does code like `str = str(...)` cause a TypeError, but only the second time?

Почему код типа `str = str (...)` вызывает ошибку типа, но только во второй раз?

У меня есть такой код, как:

def example(parameter):
global str
str = str(parameter)
print(str)

example(1)
example(2)

Первый вызов example работает, но затем во второй раз я получаю ошибку типа:

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

Почему это происходит и как я могу это исправить?


Если вы находитесь в интерактивном сеансе и столкнулись с подобной проблемой, и вы хотите устранить проблему без перезапуска интерпретатора, смотрите Как восстановить встроенную программу, которую я случайно перезаписал?.

Переведено автоматически
Ответ 1

Где в коде говорится:

global str
str = str(parameter)

Вы переопределяете, что str() означает. str это встроенное в Python имя строкового типа, и вы не хотите его менять.

Используйте другое имя для локальной переменной и удалите оператор global.

Обратите внимание, что если вы использовали подобный код в Python REPL, то присвоение глобальному str будет сохраняться до тех пор, пока вы с этим что-то не сделаете. Вы можете перезапустить интерпретатор, или del str. Последнее работает, потому что str это не на самом деле определенная глобальная переменная по умолчанию - вместо этого она обычно находится в резервном варианте (builtins стандартный библиотечный модуль, который специально импортируется при запуске и получает глобальное имя __builtins__).

Ответ 2

Хотя ее и нет в вашем коде, другая трудноопределимая ошибка заключается в том, что % символ отсутствует при попытке форматирования строки:

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

но это должно быть:

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

Отсутствие % приведет к тому же TypeError: 'str' object is not callable.

Ответ 3

В моем случае у меня был класс, в котором были метод и строковое свойство с тем же именем, я пытался вызвать метод, но получал строковое свойство.

Ответ 4

Обратите внимание, что TypeError: 'str' object is not callable означает только попытку вызвать (т. Е. Использовать синтаксис вызова функции) строку (т.Е. Любое имя, которому ранее была присвоена строка). Использование любого другого встроенного метода в качестве имени переменной может вызвать точно такое же сообщение об ошибке.

2023-04-26 04:11 python