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

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.


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.


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.


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 .


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.


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.


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.


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.


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!!')

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"


2

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

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

a[3] = l

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!


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.


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.


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


-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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.