加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – mypy设置字典键/接口

发布时间:2020-12-20 11:05:16 所属栏目:Python 来源:网络整理
导读:假设我有一个将字典作为参数的函数: def f(d: dict) - None: x = d["x"] print(x) 我可以指定此字典必须具有mypy的键“x”吗?我正在寻找类似于interface from typescript的东西,而不是将d改为类. 我不想将d更改为类的原因是因为我正在修改现有的大型代码库
假设我有一个将字典作为参数的函数:

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类型提示检查器中不可用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读