我如何创建一个带有不可变变量的python dict,这些变量正在变化?

我如何创建一个带有不可变变量的python dict,这些变量正在变化?,python,dictionary,Python,Dictionary,我想要一本这样的字典: primary = "#efefef" style = { "H2": { "text-align": "center", "color": primary } } 或者更好的连接字典,如: colors = { "primary" : "#efefef" } styles

我想要一本这样的字典:

primary = "#efefef"

style = {
    "H2": {
        "text-align": "center",
        "color": primary
    }
}
或者更好的连接字典,如:

colors = {
    "primary" : "#efefef"
}

styles = {
    "H2": {
        "text-align": "center",
        "color": colors["primary"]
    }
}
如何将样式dict与变量primary或dict colors连接起来,以便在primary或colors获得新值时dict样式发生变化?

您可以使用它创建依赖于其他dict的映射。如果相关密钥相同,则此操作有效,因此您可以使用它来解决第一种情况:

from collections import ChainMap

primary = {"color": "#efefef"}
style = {
    "H2": ChainMap({"text-align": "center"}, primary),
}

print(style)
primary["color"] = "#000000"
print(style)
这将提供以下输出:

{'H2':链映射({'text-align':'center'},{'color':'efefefef'})
{'H2':链映射({'text-align':'center'},{'color':'000000'})

第二种情况可以通过自定义dict类来解决,以延迟
\uuu getitem\uuu
调用:

from collections import UserDict
    

class LazyDict(UserDict):
    def __getitem__(self, key):
        return LazyItem(self.data, key)


class LazyItem:
    def __init__(self, mapping, key):
        self.mapping = mapping
        self.key = key

    @property
    def value(self):
        return self.mapping[self.key]


class EagerDict(dict):
    def __getitem__(self, key):
        obj = super().__getitem__(key)
        if isinstance(obj, LazyItem):
            return obj.value
        return obj


colors = LazyDict({
    "primary" : "#efefef",
})
styles = {
    "H2": EagerDict({
        "text-align": "center",
        "color": colors["primary"],
    }),
}

print(styles["H2"]["color"])
colors["primary"] = "#000000"
print(styles["H2"]["color"])

你不能。充其量,您可以将某个类的实例放入其中,然后更改其属性。您的最终目标是什么?这似乎是一个错误。