TypeError: об'єкт 'str' не можна викликати (Python)


79

Код:

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

6
Перейменуйте ВСІ екземпляри вашої strзмінної, включаючи той у рядку 53, на який скаржиться ця помилка.
Адам Розенфілд,

Відповіді:


134

Ось проблема:

global str

str = str(mar)

Ви перевизначаєте, що str()означає. strце вбудоване ім'я Python типу рядка, і ви не хочете його змінювати.

Використовуйте інше ім’я для локальної змінної та видаліть globalоператор.


7
не призначений для використання, але в якості альтернативи str()функція також доступна як __builtins__.str(). Звичайно, це погана ідея використовувати це в 99,9999% випадків, я думаю.
n611x007

2
Пам'ятайте, що вам потрібно буде перезапустити ядро ​​python, щоб повернути str()функціональність.
yeliabsalohcin

5
@yeliabsalohcin, ви можете просто, del strякщо випадково перезаписали його, і вбудована функціональність буде відновлена.
wovano

Я оголосив змінну (str = 1) і отримав помилку. Тож мені НЕ довелося ділити вул. щоб str () знову працював. У будь-якому разі Чудова порада!
Тимо

119

Хоча в коді немає, ще одна важко помітна помилка - %це відсутність символу при спробі форматування рядка:

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

але це повинно бути:

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

Зниклі %б призвели до того ж TypeError: 'str' object is not callable.


6
Дякую вам сер! Проста помилка, але це сильно впливає на руйнування сценарію.
ChrisR

Я знаю, що це справді давно, але у мене щойно виникла ця проблема, і ця відповідь допомогла, дякую @naxa
Bbit

Це мене просто врятувало після години усунення несправностей. Дякую!
Майкл

Дякую, саме це спричинило ту саму помилку у моєму випадку.
saran3h

Наявність властивості та методу з однаковим ім'ям, перезапис методу рядком, а потім спроба виконати цей метод / рядок також дала TypeError: об'єкт 'str' не можна
викликати

26

У моєму випадку у мене був клас, який мав метод і властивість string з однойменною назвою, я намагався викликати метод, але отримував властивість string.


дякую - налагодження деякого коду та законного методу мало анотацію @property, яку я не помітив, ваша відповідь допомогла мені це побачити.
jgreve

може бути приємно, щоб тінізація входила в систему, і щось на зразок суворого режиму спричиняло якесь попередження про час виконання, але це так; цілком дійсний python замінити атрибут методом і навпаки специфікацією
ThorSummoner

18

Ви можете отримати цю помилку, якщо маєте змінну strта намагаєтесь викликати str()функцію.


Дякую за цю відповідь "простою англійською мовою", дуже корисну для цього пітона n00b ;-)
Пім Хазебрук

17

Важливо зазначити (на випадок, якщо ви прийшли сюди через Google), що "TypeError: об'єкт" str "не викликається " означає лише те, що змінну, яка раніше була оголошена як String-тип, намагаються використовувати як функцію (наприклад, додаючи в кінці парантези.)

Ви можете отримати точно таке саме повідомлення про помилку, якщо ви використовуєте будь-який інший вбудований метод як ім'я змінної.


8

Інший випадок цього: змішання з __repr__функцією об’єкта, коли format()виклик виходить з ладу непрозоро.

У нашому випадку ми використовували @propertyдекоратор на __repr__і передавали цей об’єкт до format(). @propertyДекоратора призводить до того , __repr__об'єкт , який буде перетворений в рядок, яка потім призводить до strоб'єкту не є спричиненої помилкою.


1
Дякую, це була проблема і для мене (я не використовував формат, але чомусь був включений @property __repr__)
Джастін,

оооо це було! Я випадково був @propertyу__str__()
sba

7

Щоразу, коли це трапляється, просто видайте наступне (це також було розміщено вище)

>>> del str

Це повинно це виправити.


5

Перевірте свої вхідні параметри та переконайтесь, що у вас немає такого імені type. Якщо так, тоді у вас буде зіткнення і ви отримаєте цю помилку.


4
str = 'Hello World String'    
print(str(10)+' Good day!!')

Навіть я зіткнувся з цією проблемою із наведеним вище кодом, оскільки ми виконуємо str()функцію тінізації .

Рішення:

string1 = 'Hello World String'
print(str(10)+' Good day!!')

3

У мене була та ж помилка. У моєму випадку не через змінну з іменем str. Але оскільки я назвав функцію з параметром str та змінною однаковими.

same_name = same_name(var_name: str)

Я запускаю це в циклі. Перший раз це працює нормально. Вдруге я отримав цю помилку. Виправлено перейменування змінної в ім'я, яке відрізняється від імені функції. Тому я думаю, що це тому, що Python одного разу прив’язує ім’я функції до області, другий раз намагається пов’язати ліву частину ( same_name =) як виклик функції та виявляє, що strпараметр відсутній, тож його немає, тоді він видає цю помилку .


2

Проблема, яку я щойно мав, випадково викликала рядок

"Foo" ("Bar" if bar else "Baz")

Ви можете об’єднати рядок, просто поклавши їх поруч один з одним так

"Foo" "Bar"

однак через відкриту фігурну дужку в першому прикладі він подумав, що я намагаюся зателефонувати "Foo"


2

можливо, ви також намагаєтесь індексувати неправильно:

a = 'apple'
a(3) ===> 'str' object is not callable

a[3] = l

2

У мене була ще одна проблема з такою ж помилкою!

Виявляється, я створив властивість на моделі, але тупо називав це властивість у дужках.

Сподіваюся, це комусь допомагає!


І більш підступно також вірно, якщо ви використовуєте метод встановлення для цієї властивості і викликаєте це в дужках.
Lokal_Profil

0

У моєму випадку у мене був клас із методом. Метод не мав "self" як перший параметр, і помилка була викликана, коли я зробив виклик методу. Як тільки я додав "self" до списку параметрів методу, це було нормально.


0

Я отримав це попередження від неповної перевірки методів:

if hasattr(w, 'to_json'):
    return w.to_json()
             ######### warning, 'str' object is not callable

Передбачалося, що w.to_jsonце струна. Рішенням було додати callable()чек:

if hasattr(w, 'to_json') and callable(w.to_json):

Потім попередження пішло.


0

рекомендується не використовувати str int listі т.д .. як імена змінних, навіть якщо python це дозволить. це пов’язано з тим, що це може спричинити такі випадки при спробі отримати доступ до зарезервованих ключових слів, які мають однакові імена


0

FWIW Я просто вдарив це про дещо інший варіант використання. Я шукав і шукав свій код, шукаючи, де я міг використовувати змінну 'str', але не зміг її знайти. Я почав підозрювати, що винуватцем цього, можливо, був один із імпортованих мною модулів ... але, на жаль, у відформатованій заяві для друку відсутній символ "%".

Ось приклад:

x=5
y=6
print("x as a string is: %s.  y as a string is: %s" (str(x) , str(y)) )

Це призведе до виводу:

   TypeError: 'str' object is not callable

Корекція:

x=5
y=6
print("x as a string is: %s.  y as a string is: %s" % (str(x) , str(y)) )

Результат очікуваного результату:

x as a string is: 5. y as a string is: 6
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.