[PYTHON] Mémo qui fait référence à la valeur du dictionnaire comme attribut (réaménagement des roues)

AttrDict est plus pratique, mais pour ceux qui veulent l'utiliser pendant un certain temps mais ne veulent pas l'installer

Définition

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

Lors de l'utilisation

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

Je veux le définir un peu plus fermement

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__Est une mesure de cornichon. Vous devez utiliser du cornichon.

Édition supplémentaire

Je l'ai également écrit sur OneLiner. 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

Mémo qui fait référence à la valeur du dictionnaire comme attribut (réaménagement des roues)
Comment obtenir toutes les clés et valeurs du dictionnaire