解构类型提示

时间:2017-03-26 20:03:01

标签: python casting type-hinting

我正在寻找一种巧妙的方法来使用Python的类型提示来构建一个非平凡的类型。

例如,从简单类型转换。

a = '5'
b: int = None

__annotations__['b'](a)  # <int 5>

但是,我不知道如何解析下面这些更复杂的事情。

b: Optional[int] = None

__annotations__['b']  # typing.Union[int, NoneType]

必须有一种解析这些方法的方法,因为类型注释对IDE这样的东西很有用。

1 个答案:

答案 0 :(得分:0)

澄清后编辑:

根据您的评论,我认为您正在询问应用程序(例如,IDE)如何解析类型注释以检查某些代码是否与它们兼容。

答案是:这是符合PEP 484标准的静态类型检查程序的主要工作,例如mypy。 Mypy有大约50k行代码,所以它并不是一件容易的事。从理论上讲,IDE可以使用mypy,从中获取所有错误消息,然后将相应的代码标记为不正确。但实际上,PyCharm和WingIDE从头开始实现大致相同的功能。

如果您需要为自己的项目解析和验证类型提示,请使用mypy API

如果您只需要解析类型注释,而不实际验证它们是否正确,则可以使用typed_ast module

原始答案:

类型提示意义上的转换旨在告诉类型检查器该变量与其认为的类型不同,因为类型检查器对您的程序的理解有限。它没有说明如何将事物从一种类型转换为另一种类型,并且在绝大多数情况下,转换要么模糊不清,要么不可能。例如,您希望这些“演员”的结果是什么:

from typing import Dict
a = 5
b: Dict[int, int]
__annotations__['b'](a)  # ??? (impossible)
c: Union[str, float]
__annotations__['c'](a)  # ??? (ambiguous)

我试图通过“解析IDE的类型注释”来猜测你的意思,但不能。也许你可以澄清更多? IDE(例如PyCharm和WingIDE)已经很好地解析了类型注释,并使用它们,例如,在您键入时自动完成标识符。