.replace() 字典中 String 的所有实例的最佳方法

Best way to .replace() all instances of a String in a dictionary

在 python 中,我从数据库中收到以下数据结构:

{
  "field":"Somestring/somestring.jpg?<<TOKEN>>",
  "list": [
     {"field": "sometring.html?<<TOKEN>>"},
     {"field2": "otherstring.mp4?<<TOKEN>>"}
   ]
}

而且这个结构很可能会被扩展以包含更多带字段的列表。

我希望将出现在我的数据结构中不同字符串中的所有“<>”实例替换为其他用于访问这些字符串所代表的 URL 的验证令牌。

有没有比循环访问每个字段,检查它是否为字符串,然后 运行:field.replace("<<TOKEN>>", my_token)

更好的方法

递归方法

这就像助行器一样工作,进入数据结构的每一层并应用处理正确类型的治疗。 这让您也可以处理特殊情况或特定数据类型。

var = {
  "field":"Somestring/somestring.jpg?<<TOKEN>>",
  "list": [
     {"field": "sometring.html?<<TOKEN>>"},
     {"field2": "otherstring.mp4?<<TOKEN>>"}
   ]
}

def replacer(obj, val:str):
    if isinstance(obj, str):
        return obj.replace('<<TOKEN>>', val)
    
    if isinstance(obj, list):
        return [replacer(x,val) for x in obj]
    
    if isinstance(obj, dict):
        return {k:replacer(x,val) for k,x in obj.items()}
    
    # other cases
    #if ...
    return obj

    
    
replacer(var, 'ciao')

#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
#  {'field2': 'otherstring.mp4?ciao'}]}

使用序列化器

如@Mahrkeenerh 所说(荣誉) 这是一个技巧,json-fied 版本也是一个字符串,所以执行单个替换的结果会更好。

序列化 -> 治愈 -> 反序列化

import json
json.loads(json.dumps(var).replace('<<TOKEN>>', 'ciao'))

#{'field': 'Somestring/somestring.jpg?ciao',
# 'list': [{'field': 'sometring.html?ciao'},
#  {'field2': 'otherstring.mp4?ciao'}]}