IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    一日一技:警告但不禁止,遗留代码的优化策略

    青南发表于 2023-11-14 13:22:43
    love 0

    在之前的多篇文章中,我都反复告诫大家,不要滥用字典来传大量数据。因为当你的函数收到一个字典的时候,你根本不知道这个字典里面有哪些Key,你必须有一层一层往上看,找到所有尝试往字典里面添加新Key的地方,你才能知道它总共有哪些Key。

    但是,在正常公司项目中,我们可能会需要维护一些历史遗留代码。代码规模大,函数调用层级非常深。并且之前的人已经使用字典来传递了大量的数据。

    短时间内,我们没有办法直接把字典改成Dataclass。那么我们能做的,就是尽量避免后续的维护者往里面加入新的Key。我以前遇到过一个项目,它有一个字典,刚刚开始初始化的时候,只有5个Key。这个字典作为参数被传入了很多个函数,每个函数都会往它里面加很多个Key。到最后,这个字典里面已经有40多个Key了。

    对历史遗留代码的修改,必须要谨小慎微,稍不注意改错一行代码,可能整个系统就不能工作了。因此,我们的目标是尽量在不影响现有代码功能的情况下,以警告而不是禁止的形式告诉其他开发者,不要再加Key进去了。如果你强行要加入,代码也能运行,但出问题你要自己负责。

    我们知道,Python 的类型标注正好就是警告但不禁止。当你的类型有问题时,他会告诉你这里有错,但你强行要运行,代码也能正常工作。

    对于字典,我们可以使用TypedDict来限制它能有哪些Key。我们来看一段代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from typing import TypedDict  


    class User(TypedDict):
    name: str
    age: int
    address: str
    salary: int


    kingname: User = {
    'name': '青南',
    'age': 18,
    'address': '上海',
    'salary': 9999999999
    }


    def test_dict(user: User):
    print(user['name'])

    这只是一段看似非常普通的代码,在PyCharm也看不出有什么异常:

    但当我想在函数里面,额外往字典加一个新字段时,就会发出警报:

    这个警告在一定程度上,可以提醒其他人不要往字典中乱加Key。虽然强行添加也没有问题,但至少起到了提醒的作用。

    如果你在一开始初始化字典时,就把类型指定好,那么你一开始就必须提供所有字段,否则它也会发出警告,如下图所示:

    这种情况下,我们可以在初始化字典时,不加类型标注,但在函数参数里面加上类型标注。那么这样以来,就能实现:只能往字典添加特定的字段,不能添加额外字段。如下图所示:



沪ICP备19023445号-2号
友情链接