在之前的多篇文章中,我都反复告诫大家,不要滥用字典来传大量数据。因为当你的函数收到一个字典的时候,你根本不知道这个字典里面有哪些Key,你必须有一层一层往上看,找到所有尝试往字典里面添加新Key的地方,你才能知道它总共有哪些Key。
但是,在正常公司项目中,我们可能会需要维护一些历史遗留代码。代码规模大,函数调用层级非常深。并且之前的人已经使用字典来传递了大量的数据。
短时间内,我们没有办法直接把字典改成Dataclass。那么我们能做的,就是尽量避免后续的维护者往里面加入新的Key。我以前遇到过一个项目,它有一个字典,刚刚开始初始化的时候,只有5个Key。这个字典作为参数被传入了很多个函数,每个函数都会往它里面加很多个Key。到最后,这个字典里面已经有40多个Key了。
对历史遗留代码的修改,必须要谨小慎微,稍不注意改错一行代码,可能整个系统就不能工作了。因此,我们的目标是尽量在不影响现有代码功能
的情况下,以警告
而不是禁止
的形式告诉其他开发者,不要再加Key进去了。如果你强行要加入,代码也能运行,但出问题你要自己负责。
我们知道,Python 的类型标注正好就是警告但不禁止。当你的类型有问题时,他会告诉你这里有错,但你强行要运行,代码也能正常工作。
对于字典,我们可以使用TypedDict
来限制它能有哪些Key。我们来看一段代码:
1 | from typing import TypedDict |
这只是一段看似非常普通的代码,在PyCharm也看不出有什么异常:
但当我想在函数里面,额外往字典加一个新字段时,就会发出警报:
这个警告在一定程度上,可以提醒其他人不要往字典中乱加Key。虽然强行添加也没有问题,但至少起到了提醒的作用。
如果你在一开始初始化字典时,就把类型指定好,那么你一开始就必须提供所有字段,否则它也会发出警告,如下图所示:
这种情况下,我们可以在初始化字典时,不加类型标注,但在函数参数里面加上类型标注。那么这样以来,就能实现:只能往字典添加特定的字段,不能添加额外字段
。如下图所示: