首页 > 解决方案 > 在 python 字典中为 mypy 指定键

问题描述

假设我有一些代码

def get_x(d: dict) -> int:
    d["x"]

但是,我想告诉 mypyd应该只包含某些键(例如只有“x”键)。这样,如果我在尝试引用无效键的代码中犯了错误d,mypy 将触发错误。

我的问题是:

  1. 这可能吗?mypy 可以验证字典键吗?
  2. 如果是,这是如何完成的?如果没有,是否有首选的解决方法?

标签: pythonpython-3.xmypypython-typing

解决方案


在尝试围绕 AWS API Gateway/Lambda 集成进行一些输入时也遇到了这个问题。

正如@Michael0x2a 在评论中指出的那样,TypedDict似乎是要走的路,特别是因为它在传递给函数之前不需要自己进行任何转换(API 响应的要求,就像你提到的那样)。

from mypy_extensions import TypedDict

DictWithOnlyX = TypedDict('DictWithOnlyX', {"x": str})

# error: Extra key 'y' for TypedDict "DictWithOnlyX@58"
dx1: DictWithOnlyX = { "y": 123 }

# error: Incompatible types (expression has type "int",
#        TypedDict item "x" has type "str")
dx2: DictWithOnlyX = { "x": 123 }

# GOOD!
dx3: DictWithOnlyX = { "x": "123" }

还应该注意,如果依赖关系在生产和开发/测试之间分离,那么这会mypy产生生产依赖。


推荐阅读