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']
-1
geeks 11 Aug. 2015 im 13:53

3 Antworten

Beste Antwort

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",
            }),])
2
SuperBiasedMan 11 Aug. 2015 im 11:31

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'
1
Dmitry.Samborskyi 11 Aug. 2015 im 11:08

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 .

0
Community 23 Mai 2017 im 11:43