Python函数式编程之 update_in_fn
接上一篇内容 Python函数式编程之自定义函数get_in 。这次我们来编写函数式风格的修改字典/列表值的通用函数。 我们先来假设一种情况,你有一个嵌套的动态字典,想要更新里面某个键对应的值,我们用代码来说明 data = {'a': {'b': 1}} 现在有一个变量data 他的值是一个两层的字典,如果我要更新 b 的值到 2 常规的做法是这样的 data['a]['b'] = 2 如果我有一个更加深的字典 data = {'a': {'b': {'c': {'d': 1}}}} 更新值的写法 data['a']['b']['c']['d''] = 2 这里有一个情况发生了,当 data 是一个动态数组,你不确定中间的某个键是否存在的时候就会有报错 假如这个数据是你的系统里面其他团队开发的一个微服务,报错的信息是int 对象是不可读取索引的,这会让人很奇怪,2这个int对象明明是一个值,而不是用来查找索引数据的。 这时候程序的健壮性是比较差的,要想让程序保证健壮,我们可以使用 if-else 来判断每个键是否存在,就像这样 这里的三个if 看起来一点都不够优雅,如果其他地方也有同样的写法,只是键的顺序和名字不一样而已呢。能不能封装一个通用的函数来处理类似的情况呢? update_in Python支持面向过程、面向对象、函数式等多范式编程。我们可以使用函数式编程思想来达到这一点。先来看一个简单一点的 update_in 函数 from typing import Dict, List, T def update_in(data: Dict, ks: List, value: T): """Updates a value in a nested associative structure. Args: data (Dict): nested associative structure ks (List): sequence of keys value (Any): new value """ if len(ks) == 0: return cursor = data for k in ks[:-1]: if k not in cursor: cursor[k] = {} elif not isinstance(cursor[k], dict): cursor[k] = {} cursor = cursor[k] cursor[ks[-1]] = value 这里有一个类型 T ,这是Python内置的任意类型,在 typing 模块可以看到定义 T = TypeVar('T') ...