python – mypy设置字典键/接口

假设我有一个将字典作为参数的函数:

def f(d: dict) -> None:
    x = d["x"]
    print(x)

我可以指定此字典必须具有mypy的键“x”吗?我正在寻找类似于interface from typescript的东西,而不是将d改为类.

我不想将d更改为类的原因是因为我正在修改现有的大型代码库以添加mypy类型检查,并且此字典在很多地方使用.如果我必须将d [“x”]的所有实例更改为d.x,我将不得不修改很多代码.

最佳答案 不,通过键入(PEP 484和PEP 526),您无法声明特定键将出现在容器中.您可以声明的只是类型,而不是运行时内容. ‘x’是特定的字符串值,而不是类型.

我知道你特别不想要这样做,但也许答案是考虑一个不同的数据结构,例如命名元组或数据类,您可以在其中指定类型具有的属性.

这就是typescript声明的作用,真的:

The printLabel function has a single parameter that requires that the object passed in has a property called label of type string.

Python属性是Typescript对象属性的道德等价物.那些Typescript对象符号和Python词典有很多共同之处可能会让人感到困惑,但是在尝试将概念映射到Python时,不应该将Typescript对象声明视为除了类之外的任何东西.

mypy确实包含了不属于Python类型提示标准的输入扩展.这包括mypy_extensions.TypeDict object,其工作方式与typing.TypeVar declaration非常相似:

from mypy_extensions import TypedDict

SomeDict = TypeDict('SomeDict', {'x': str})

def f(d: SomeDict) -> None:
    x = d['x']
    print(x)

或使用基于类的语法:

class SomeDict(TypeDict)
    x: str

TypeDict声明中的键要么全部都需要,要么全部是可选的(当你在声明中设置total = False时);你必须使用继承来生成一些带有可选键的类型,请参阅链接的文档.

但请注意,TypeDict是实验性的,可以在将来的mypy版本中再次删除或大幅改变,并且在其他Python类型提示检查器中不可用.

点赞