假设我有一些代码如下:
def get_x(d: dict) -> int:
d["x"]
然而,我希望告诉mypy,d
应该只包含特定的键(例如只有“x”键)。这样,如果我在代码中较低的位置犯了一个错误,试图引用d
的无效键,mypy将触发错误。
我的问题是:
- 这是否可行?能否使用mypy验证字典键?
- 如果可以,如何实现?如果不行,是否有更好的解决方案?
假设我有一些代码如下:
def get_x(d: dict) -> int:
d["x"]
然而,我希望告诉mypy,d
应该只包含特定的键(例如只有“x”键)。这样,如果我在代码中较低的位置犯了一个错误,试图引用d
的无效键,mypy将触发错误。
我的问题是:
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
成为一个生产依赖项。from collections import namedtuple
A = namedtuple("A", ["x", "y", "z"])
def get_x(d: A) -> int:
d.x
__slot__
属性。这也可以防止意外插入新属性。class A:
__slot__ = ["x", "y", "z"]
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z