Während der Iteration der Liste meters_info
wird der Fehler list indices must be integers, not str
angezeigt. Warum erhalte ich einen solchen Fehler? Vielen Dank, Leute, die mich darauf hingewiesen haben, dass sich die Originalanwendung in django befindet und ich sie in eine Flaschen-App umwandle. In Django sind sie datastructures.SortedDict
. Wie ich die gleiche Funktionalität in Kolben benutze Siehe diesen Link
from django.utils import datastructures
meters_info = datastructures.SortedDict([
("instance", {
'label': '',
'description': _("Existence of instance"),
}),
("instance:<type>", {
'label': '',
'description': _("Existence of instance <type> "
"(openstack types)"),
}),
("memory", {
'label': '',
'description': _("Volume of RAM"),
}),])
Flaschen-App
def _get_nova_meters_info(self):
meters_info= [
("instance", {
'label': '',
'description': "Existence of instance",
}),
("instance:<type>", {
'label': '',
'description': "Existence of instance <type> (openstack types)",
}),
("memory", {
'label': '',
'description': "Volume of RAM",
}),]
Nachricht in der Konsole abrufen
File "/home/vagrant/api/ceilometer.py", line 137, in _get_nova_meters_info
meters_info[name]=dict(meters_info["instance:<type>"])
TypeError: list indices must be integers, not str
Bitte beachten Sie die folgende Methode, bei der ich eine Fehlermeldung erhalte
for flavor in self.get_flavor_names():
name='instance:%s' %flavor
meters_info[name]=dict(meters_info["instance:<type>"])
meters_info[name]['description']= (
'Duration of instance type %s (openstack flavor)' % flavor)
return meters_info
def get_flavor_names(self):
return ['m1.tiny', 'm1.small', 'm1.medium', 'm1.large', 'm1.nano','m1.xlarge', 'm1.micro']
3 Antworten
Sie haben eine Liste von Tupeln mit Wörterbüchern. Auf diese kann nicht mit Zeichenfolgen zugegriffen werden. Sie müssen Ganzzahlen verwenden. Die ursprüngliche Django-App verwendete eine spezielle Art von Django-Wörterbuch namens SortedDict
. Zum Glück hat Python seit 2.7 ein Äquivalent namens OrderedDict
. Sie müssen es nur so importieren
from collections import OrderedDict
Passen Sie dann Ihre Syntax an, um OrderedDict
zu verwenden, und entfernen Sie das _()
um die Werte:
meters_info = OrderedDict([
("instance", {
'label': '',
'description': "Existence of instance",
}),
("instance:<type>", {
'label': '',
'description': "Existence of instance <type> "
"(openstack types)",
}),
("memory", {
'label': '',
'description': "Volume of RAM",
}),])
Um Daten auf diese Weise zu verwenden, müssen Sie meter_info im Wörterbuch neu erstellen:
meters_info= {
"instance" : {
'label': '',
'description': "Existence of instance",
},
"instance:<type>" : {
'label': '',
'description': "Existence of instance <type> (openstack types)",
},
"memory" : {
'label': '',
'description': "Volume of RAM",
},}
Es ist auch besser, wenn Sie dieselbe Struktur haben, um Klassen zu verwenden. Beispielsweise
class Meters_info_param_stucture(object):
def __init__(self, label = None, description = None):
self.label = label
self.description = description
meters_info= {
"instance" : Meters_info_param_stucture(description = "Existence of instance"),
"instance:<type>" : Meters_info_param_stucture(description = "Existence of instance <type> (openstack types)"),
"memory" : Meters_info_param_stucture(description = "Volume of RAM"),}
>>>meters_info["memory"].description
'Volume of RAM'
Das Problem ist, dass Ihr Array ein list
von tuple
ist und ein tuple
ein str
als erstes Element und dict
als zweites Element hat. Sie sollten also folgendermaßen darauf zugreifen:
meters_info[0][0][<some_key>]
Beispielsweise:
meters_info[0][0]["instance"]
Aber ich verstehe die Struktur und den Grund, warum Sie sie so halten, nicht. Sie sollten lieber in Betracht ziehen, meters_info
in ein Wörterbuch umzuwandeln, wie dies Dmitry.Samborskyi
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.