Подтвердить что ты не робот

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

Ответ 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" в список параметров метода, это было нормально.