[PYTHON] Notiz, die sich auf den Wert des Wörterbuchs als Attribut bezieht (Neuentwicklung von Rädern)

AttrDict ist bequemer, aber für diejenigen, die es für eine Weile verwenden möchten, es aber nicht installieren möchten

Definition

class Dict(dict): pass
Dict.__getattr__ = lambda s, k: s.get(k)

Beim Benutzen

a = Dict(a=0, b=Dict(c=1, d=2))
(a.a, a.b.c, a["a"], a["b"]["c"])

Ich möchte es etwas fester definieren

class Dict(dict):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    
    def __getattr__(self, key):
        return self.get(key)
    
    def __getstate__(self):
        return self.__dict__
    
    def __setstate__(self, dict_):
        self.__dict__ = dict_

a = Dict(a=0, b=Dict(c=1, d=2))
(a.a, a.b.c, a["a"], a["b"]["c"], pickle.loads(pickle.dumps(a)))

__getstate__, __setstate__Ist ein Gurkenmaß. Sie müssen Gurke verwenden.

Sonderedition

Ich habe es auch auf OneLiner geschrieben. Kaketadake

globals().update({"D": type("D", (dict,), {"__getattr__": lambda s, k: s.get(k)})}); D(a=1, b=D(c=2, d=3)).b.c

Recommended Posts

Notiz, die sich auf den Wert des Wörterbuchs als Attribut bezieht (Neuentwicklung von Rädern)
So erhalten Sie alle Schlüssel und Werte im Wörterbuch