如何在字典的值中将所有占位符值替换掉?

编程语言 2026-07-09

想找出在Python的字典对象中替换占位符值的最佳方式。举例来说,如果我已经定义了 {env}_test,并向我的函数传入一个参数 dev,我希望它能转换为 dev_test

比如我有如下内容:

my_dct = {
    "pipeline": "Test Pipeline",
    "environment": "dev",
    "test": {
        "{env}_test2": {
            "test3": ["{env}_test4", "{env}_test5"]
        }
    }
}

将其经由函数运行后的样子是这样的:

print(my_function(my_dct, "dev"))

{
    "pipeline": "Test Pipeline",
    "environment": "dev",
    "test": {
        "dev_test2": {
            "test3": ["dev_test4", "dev_test5"]
        }
    }
}

我已经尝试过递归遍历,但对列表值而言有点复杂。为了最初得到这个字典,我是在读取一个JSON文件时创建它——所以我在想,是否有一种更简单的方法,在读取并将它放入字典时就对这些值进行转换,或者我还遗漏了其他办法。

解决方案

一个简单的递归就能解决。

def replace_env(obj, env: str):
    if isinstance(obj, dict):
        return {replace_env(k, env): replace_env(v, env) for k, v in obj.items()}
    if isinstance(obj, list):
        return [replace_env(x, env) for x in obj]
    if isinstance(obj, str):
        return obj.replace("{env}", env)
    return obj


if __name__ == "__main__":
    my_dct = {
        "pipeline": "Test Pipeline",
        "environment": "dev",
        "test": {
            "{env}_test2": {
                "test3": ["{env}_test4", "{env}_test5"],
            }
        },
    }
    print(replace_env(my_dct, "dev"))

备选方案

将对象序列化为字符串,进行替换,然后再反序列化回去。

与其手动对字典进行递归遍历,不如将整个结构转换为JSON字符串,进行替换后再解析回来:

import json
def apply_env(dct: dict, env: str) -> dict:
    raw = json.dumps(dct)
    return json.loads(raw.replace("{env}", env))

这一次性处理键、值和嵌套的列表,无需递归。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章