Was Könnte die Ursache Python-Fehler 'str' object does not support item assignment
Ich versuche zu Debuggen, einige Python-2.7.3-code, um eine Schleife durch eine Liste der Elemente, und konvertieren jeweils einen string:
req_appliances = ['9087000CD', 'Olympus', 185]
for i in range(0, len(req_appliances)):
req_appliances[i] = str(req_appliances[i])
print req_appliances
Die Ausgabe ist wie folgt:
['9087000CD', 'Olympus', '185']
Im obigen Beispiel habe ich den Wert des req_appliances ausdrücklich zum testen der Schleife. Im tatsächlichen code, req_appliances ist ein argument für eine Funktion. Ich weiß nicht, den Typ des Arguments zur Laufzeit, aber es erscheint eine Liste von skalaren Werten. Ich weiß, dass ich beim aufrufen der Funktion, sehe ich die folgende Fehlermeldung:
File ".../database.py", line 8277, in get_report_appliance_list
req_appliances[i] = str(req_appliances[i])
TypeError: 'str' object does not support item assignment
Ich versuche ableiten, für welche Werte von argument req_appliances es wäre möglich, dass dieser Fehler entstehen. Es scheint mir, dass alle Werte sind Skalare, und jeder (auch wenn unveränderbar) sollte eine gültige LS-Ausdrücke, die in einen Auftrag. Gibt es etwas, was fehlt mir hier? Hier ist der code, der im Kontext, in der Funktion in der Sie definiert ist:
def get_report_appliance_list(self, req_appliances, filter_type=None):
appliances = {}
appliance_list = []
if filter_type != None:
if filter_type not in ('appliances', 'servers'):
raise ValueError("appliance filter_type must be one of 'appliances' or 'servers'")
active_con = self.get_con()
if active_con is None:
raise Exception('No database connections are available.')
con = None
in_expr_items = ''
if req_appliances != None:
# Create a string like '(%s, %s, ...)' to represent
# the 'in' expression items in the SQL.
print(req_appliances)
for i in range(0, len(req_appliances)):
req_appliances[i] = str(req_appliances[i])
in_expr_items += '%s,'
in_expr_items = '(' + in_expr_items[:-1] + ') '
- Ich vermute, dass die req_applieances, dass die Ursachen dieser ist eine Zeichenfolge, die Sie erwartet eine Liste, aber in diesem Fall ist es ein string. Finden Sie die betreffende Zeile
- Ich nehme an, du bist die übergabe eines tatsächlichen string... Ohne zu sehen, Ihre Funktion, Definition (und die Argumente), ist es schwer zu sagen, aber es kann sein, Sie wollen variable Argumente
def your_func(*req_appliances)
zum Beispiel...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer
str
wirkt wie ein Sequenz-Typ (man kann Durchlaufen), aber strings in Python unveränderlich sind, so können Sie nicht neue Werte zuweisen jeder der Indizes.Erwarte ich, was hier passiert ist, dass du versuchst, diese laufen wenn
req_appliances
ist einstr
Objekt.Kam ich mit zwei Möglichkeiten, dieses Problem zu beheben:
Erste, nur überprüfen, ob es eine
str
, bevor Sie Durchlaufen es:Zweitens könnte Sie überprüfen Sie jedes Einzelteil, um zu sehen, ob es schon einen string, bevor Sie versuchen zu zuordnen.
Hier bin ich wirklich prüfen, ob das Element gleich der string-Darstellung. Dies ist der Fall, wenn Sie iterieren über strings.
Dies ist nicht wirklich eine Antwort auf deine Frage, aber einen Stil zu beraten. Wenn Sie geschehen, zu verwenden
for i in range(0, len(something))
eine Menge verwenden Sie entwederfor i, obj in enumerate(something)
,map(func, something)
oder eine Liste Verständnis[func(x) for x in something]
.Weitere rote Flagge ist die Verwendung von string
+=
innerhalb einer Schleife. Besser ein array erstellen und beitreten. Dies beseitigt auch die Notwendigkeit, um Dinge zu tun wie[-1]
um loszuwerden, der trailing Kommas.Bezüglich Ihrem code könnten Sie vereinfachen es eine Menge:
Abgesehen davon, dass ich würde empfehlen, dass
get_con()
wirft, so dass Sie nicht haben, um zu überprüfen, fürNone
im code.