TypeError: объект 'str' не может быть вызван (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'
Первый Dict(z, 'w')
работает, а затем второй раз вокруг него возникает ошибка:
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
Кто-нибудь знает, почему это?
@Greg Hewgill:
Я уже пробовал это, и я получаю сообщение об ошибке:
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
Ответы
Ответ 1
В этом проблема:
global str
str = str(mar)
Вы переопределяете то, что означает str()
. str
- это встроенное имя типа Python для типа строки, и вы не хотите его изменять.
Используйте другое имя для локальной переменной и удалите оператор global
.
Ответ 2
В то время как в коде нет другой ошибки, трудно заметить, когда символ %
отсутствует при попытке форматирования строки:
"foo %s bar %s coffee"("blah","asdf")
но это должно быть:
"foo %s bar %s coffee"%("blah","asdf")
Отсутствующий %
приведет к тому же TypeError: 'str' object is not callable
.
Ответ 3
В моем случае у меня был класс, у которого был метод и свойство строки с тем же именем, я пытался вызвать этот метод, но получал свойство string.
Ответ 4
Другой случай этого: Messing с помощью функции __repr__
объекта, где вызов format()
выполняется не прозрачно.
В нашем случае мы использовали декоратор @property
на __repr__
и передали этот объект в format()
. Декоратор @property
заставляет объект __repr__
превращаться в строку, которая затем приводит к тому, что объект str
не является вызываемой ошибкой.
Ответ 5
Вы можете получить эту ошибку, если у вас есть переменная str
и пытается вызвать функцию str()
.
Ответ 6
У меня была такая же ошибка. В моем случае wasn`t из-за переменной с именем str. Но поскольку я назвал функцию с параметром str, а переменная - тем же.
same_name = same_name (var_name: str).
Я запускаю его в цикле. В первый раз он работает нормально. Во второй раз я получил эту ошибку. Переименование переменной на имя, отличное от имени функции, исправлено. Поэтому я думаю, что это связано с тем, что Python однажды ассоциирует имя функции в области, второй раз пытается связать левую часть (same_name =) в качестве вызова функции и обнаруживает, что параметр str отсутствует, поэтому он отсутствует, то он выдает эту ошибку.
Ответ 7
В моем случае у меня был класс с методом в нем. У метода не было "я" в качестве первого параметра, и ошибка была вызвана, когда я сделал вызов метода. Как только я добавил "self" в список параметров метода, это было нормально.