TypeError: 'str'-Objekt kann nicht aufgerufen werden (Python)

76

Code:

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'

Das erste Dict(z, 'w')funktioniert und beim zweiten Mal tritt ein Fehler auf:

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

Weiß jemand warum das so ist?

@ Greg Hewgill:

Ich habe das bereits versucht und bekomme den Fehler:

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
P'sao
quelle
6
Benennen Sie ALLE Instanzen Ihrer strVariablen um, einschließlich der in Zeile 53, über die sich dieser Fehler beschwert.
Adam Rosenfield

Antworten:

128

Das ist das Problem:

global str

str = str(mar)

Sie definieren neu, was str()bedeutet. strist der integrierte Python-Name des Zeichenfolgentyps, den Sie nicht ändern möchten.

Verwenden Sie einen anderen Namen für die lokale Variable und entfernen Sie die globalAnweisung.

Greg Hewgill
quelle
7
nicht zur Verwendung gedacht, aber alternativ ist die str()Funktion auch als verfügbar __builtins__.str(). Natürlich ist es eine schlechte Idee, das in 99,9999% der Fälle zu verwenden, denke ich.
n611x007
2
Denken Sie daran, dass Sie den Python-Kernel neu starten müssen, damit die str()Funktionalität zurückgegeben wird.
Yeliabsalohcin
5
@yeliabsalohcin, können Sie nur, del strwenn Sie es versehentlich überschrieben haben und die eingebaute Funktionalität wiederhergestellt wird.
Wovano
118

Ein weiterer schwer zu erkennender Fehler ist, dass das %Zeichen bei einem Versuch der Zeichenfolgenformatierung fehlt, obwohl es nicht in Ihrem Code enthalten ist:

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

aber es sollte sein:

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

Das Fehlen %würde zum gleichen Ergebnis führen TypeError: 'str' object is not callable.

n611x007
quelle
6
Danke mein Herr! Einfacher Fehler, aber stark betroffen, um ein Skript zu ruinieren.
ChrisR
Ich weiß, dass dies wirklich alt ist, aber ich hatte gerade dieses Problem und diese Antwort half, danke @naxa
Bbit
Dies hat mich nach einer Stunde Fehlerbehebung gerettet. Vielen Dank!
Michael
Danke, das hat in meinem Fall den gleichen Fehler verursacht.
Saran3h
Eine Eigenschaft und eine Methode mit demselben Namen zu haben, die Methode mit einer Zeichenfolge zu überschreiben und dann zu versuchen, diese Methode / Zeichenfolge auszuführen, ergab auch TypeError: 'str'-Objekt ist nicht aufrufbar
Puggan Se
26

In meinem Fall hatte ich eine Klasse mit einer Methode und einer gleichnamigen Zeichenfolgeeigenschaft. Ich habe versucht, die Methode aufzurufen, aber die Zeichenfolgeeigenschaft abgerufen.

ThorSummoner
quelle
Vielen Dank - das Debuggen von Code und einer legitimen Methode hatte eine @ property- Annotation, die ich nicht bemerkt habe. Ihre Antwort hat mir geholfen, sie zu sehen.
Jgreve
Es könnte schön sein, wenn Shadowing protokolliert wird und so etwas wie ein strenger Modus eine RuntimeWarning verursacht, wenn dies passiert, aber eh; Es ist völlig gültig, Python, um ein Attribut durch eine Methode zu ersetzen und umgekehrt durch die Spezifikation
ThorSummoner
18

Sie können diesen Fehler erhalten, wenn Sie eine Variable haben strund versuchen, die str()Funktion aufzurufen .

Dmitry
quelle
Danke für diese Antwort in "
normalem
16

Es ist wichtig zu beachten (falls Sie von Google hierher gekommen sind), dass "TypeError: 'str' Objekt ist nicht aufrufbar " nur bedeutet, dass versucht wird, eine Variable, die zuvor als String-Typ deklariert wurde, als Funktion zu verwenden (z. B. von am Ende Klammern hinzufügen.)

Sie können genau dieselbe Fehlermeldung auch erhalten, wenn Sie eine andere integrierte Methode als Variablennamen verwenden.

Alexander H. Stebner
quelle
8

Ein weiterer Fall: Spielen mit der __repr__Funktion eines Objekts, bei dem ein format()Aufruf nicht transparent fehlschlägt.

In unserem Fall haben wir einen @propertyDekorateur für das verwendet __repr__und dieses Objekt an a übergeben format(). Der @propertyDekorateur bewirkt, dass das __repr__Objekt in eine Zeichenfolge umgewandelt wird, was dann dazu führt, dass das strObjekt kein aufrufbarer Fehler ist.

Luciano
quelle
1
Vielen Dank, dies war auch das Problem für mich (ich habe kein Format verwendet, aber aus irgendeinem Grund gab es eine @ Eigenschaft auf __repr__)
Justin
oooo das war es! Ich hatte versehentlich @propertyauf a__str__()
sba
6

Wenn dies passiert, geben Sie einfach Folgendes aus (es wurde auch oben veröffentlicht)

>>> del str

Das sollte es beheben.

Chikitin
quelle
5

Überprüfen Sie Ihre Eingabeparameter und stellen Sie sicher, dass Sie keinen Namen haben type. Wenn ja, dann haben Sie einen Konflikt und erhalten diesen Fehler.

Gabriel Fair
quelle
3
str = 'Hello World String'    
print(str(10)+' Good day!!')

Sogar ich hatte Probleme mit dem obigen Code, da wir die Funktion str () beschatten.

Lösung ist:

string1 = 'Hello World String'
print(str(10)+' Good day!!')
karthik akinapelli
quelle
2

Ein Problem, das ich gerade hatte, war das versehentliche Aufrufen einer Zeichenfolge

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

Sie können Zeichenfolgen verketten, indem Sie sie einfach so nebeneinander platzieren

"Foo" "Bar"

Aufgrund der offenen Klammer im ersten Beispiel dachte ich jedoch, ich würde versuchen anzurufen "Foo"

Anis Jonischkeit
quelle
2

Es könnte auch sein, dass Sie versuchen, falsch zu indizieren:

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

a[3] = l
Ahmadiah
quelle
2

Ich hatte noch ein Problem mit dem gleichen Fehler!

Es stellte sich heraus, dass ich eine Eigenschaft für ein Modell erstellt hatte, diese Eigenschaft aber dumm in Klammern aufrief.

Hoffe das hilft jemandem!

Joseph Gill
quelle
Und schleichender auch, wenn Sie die Setter-Methode für diese Eigenschaft verwenden und diese mit Klammern aufrufen.
Lokal_Profil
2

Ich hatte den gleichen Fehler. In meinem Fall lag das nicht an einer Variablen namens str. Aber weil ich eine Funktion mit einem str-Parameter und der Variablen gleich benannt habe.

same_name = same_name( var_name: str)

Ich führe es in einer Schleife aus. Das erste Mal läuft es in Ordnung. Das zweite Mal habe ich diesen Fehler bekommen. Das Umbenennen der Variablen in einen anderen Namen als den Funktionsnamen hat dies behoben. Ich denke, das liegt daran, dass Python einmal einen Funktionsnamen in einem Bereich zugeordnet hat und beim zweiten Mal versucht, den linken Teil (same_name =) als Aufruf der Funktion zuzuordnen, und feststellt, dass der str-Parameter nicht vorhanden ist. dann wirft es diesen Fehler.

Luis
quelle
0

Ich habe diese Warnung von einer unvollständigen Methodenprüfung erhalten:

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

Es wurde angenommen, dass w.to_jsones sich um eine Zeichenfolge handelte. Die Lösung bestand darin, einen callable()Scheck hinzuzufügen :

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

Dann ging die Warnung weg.

Bob Stein
quelle
0

Es wird empfohlen, str int listetc .. nicht als Variablennamen zu verwenden, obwohl Python dies zulässt. Dies liegt daran, dass beim Versuch, auf reservierte Schlüsselwörter mit demselben Namen zuzugreifen, solche Unfälle auftreten können

Nadavo
quelle
-1

In meinem Fall hatte ich eine Klasse mit einer Methode. Die Methode hatte nicht 'self' als ersten Parameter und der Fehler wurde ausgelöst, als ich die Methode aufrief. Nachdem ich der Parameterliste der Methode 'self' hinzugefügt hatte, war dies in Ordnung.

bläulich räumlich
quelle