如何在字典的值中将所有占位符值替换掉?
想找出在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。