强制通过 .get(...) 访问字典以防止 KeyErrors

问题描述 投票:0回答:1

我经常遇到

KeyErrors
被这样的情况触发

d: dict[str, int] = {"a": 1}
foo = "bar"
...
d[foo]  # boom

我们的团队使用 mypy 进行类型检查。如果可以自动检测

d[foo]
的使用,并禁止使用
d.get(foo)
,则结果将具有明确的
Optional[int]
类型,这将防止作者忘记密钥的边缘情况不存在。

是否有工具能够检测并警告此类方括号访问?在某些情况下我会忘记

.get(...)
不能作为替代方案吗?

python mypy lint typing semgrep
1个回答
0
投票

你绝对可以用 Semgrep 做到这一点,甚至建议修复:

rules:
- id: use .get
  patterns:
    - pattern-inside: |
        $D = {...}
        ...
    - pattern: $D[$K]
  fix: $D.get($K)
  message: Match found
  languages: [python]
  severity: WARNING

游乐场链接:https://semgrep.dev/s/B3o5

© www.soinside.com 2019 - 2024. All rights reserved.