481 Stimmen

Wie verwende ich einen Punkt "." um auf Elemente eines Wörterbuchs zuzugreifen?

Wie mache ich Python-Wörterbuchmitglieder über einen Punkt "." zugänglich?

Zum Beispiel würde ich gerne statt mydict['val'] mydict.val schreiben.

Außerdem würde ich gerne auf verschachtelte Wörterbücher auf diese Weise zugreifen. Zum Beispiel

mydict.mydict2.val 

würde sich auf

mydict = { 'mydict2': { 'val': ... } }

32 Stimmen

Viele der Situationen, in denen Menschen verschachtelte Dicts verwenden, könnten genauso gut oder sogar besser durch Dicts mit Tupeln als Schlüssel gelöst werden, wobei d[a][b][c] durch d[a, b, c] ersetzt wird.

0 Stimmen

Können Sie bitte näher erläutern, wie d[a][b][c] durch d[a, b, c] ersetzt werden kann? Ich habe noch nicht verstanden, wie das gemacht werden kann.

9 Stimmen

Es ist kein Zauberei: foo={}; foo[1,2,3] = "one, two, three!"; foo.keys() => [(1,2,3)]

28voto

Dave Punkte 3976

Fabric hat eine wirklich schöne, minimalistische Implementierung. Indem wir dies für den verschachtelten Zugriff erweitern, können wir ein defaultdict verwenden, und das Ergebnis sieht ungefähr so aus:

from collections import defaultdict

class AttributeDict(defaultdict):
    def __init__(self):
        super(AttributeDict, self).__init__(AttributeDict)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError(key)

    def __setattr__(self, key, value):
        self[key] = value

Verwenden Sie es wie folgt:

keys = AttributeDict()
keys.abc.xyz.x = 123
keys.abc.xyz.a.b.c = 234

Dies erläutert ein wenig Kugels Antwort von "Abgeleitet von dict und Implementierung von __getattr__ und __setattr__". Jetzt wissen Sie, wie es geht!

24voto

tdihp Punkte 2259

Ich habe das versucht:

class dotdict(dict):
    def __getattr__(self, name):
        return self[name]

Du kannst auch __getattribute__ versuchen.

Es wäre gut genug, wenn du jeden dict zu einem Typ von dotdict machst; Wenn du dies aus einem mehrschichtigen dict initialisieren möchtest, versuche auch __init__ zu implementieren.

21voto

Pradip Gupta Punkte 499

Ich bin kürzlich auf die 'Box' Bibliothek gestoßen, die dasselbe tut.

Installationsbefehl: pip install python-box

Beispiel:

from box import Box

mydict = {"key1":{"v1":0.375,
                    "v2":0.625},
          "key2":0.125,
          }
mydict = Box(mydict)

print(mydict.key1.v1)

Ich habe festgestellt, dass sie effektiver ist als andere vorhandene Bibliotheken wie dotmap, die einen Python-Rekursionsfehler generieren, wenn Sie große verschachtelte dicts haben.

Link zur Bibliothek und Details: https://pypi.org/project/python-box/

16voto

Mike Graham Punkte 68846

Nicht. Attributzugriff und Indexierung sind separate Dinge in Python, und du solltest nicht wollen, dass sie dasselbe ausführen. Erstelle eine Klasse (möglicherweise eine, die von namedtuple erstellt wurde), wenn du etwas hast, das über zugreifbare Attribute verfügen sollte, und verwende die []-Notation, um ein Element aus einem Dictionary zu erhalten.

15voto

hardika Punkte 366

Sie können dies mit SimpleNamespace erreichen

from types import SimpleNamespace
# Werte zuweisen
args = SimpleNamespace()
args.username = 'admin'

# Werte abrufen
print(args.username)  # Ausgabe: admin

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X