3

我有一些 Python 源代码,想找出变量的类型。例如给定字符串

"""
greeting = "Hello"
"""

我想拥有get_type('greeting') == str。或者更复杂的例子:

"""
def test(input: str):
    output = len(input)
    return str
"""

在伪代码中,我希望能够执行以下操作:

>>> m = parse_module()
>>> m.functions['test'].locals['output'].get_type()
int

似乎这应该可以在 Python 3 中使用类型注释和 MyPy,但我不知道如何。像 VS 代码这样的 IDE 已经非常擅长猜测 python 代码中的类型,这就是为什么我猜测必须有一种公开的方式来做到这一点。

似乎有一个模块typed-ast,它也被 MyPy 使用,这让我成为了其中的一部分。但是,这并没有类型推断或传播,它只是给了我据我所知的显式注释。MyPy 作为 api,但它只允许您运行检查器,并返回与命令行工具相同的错误消息。我正在寻找一种“接触”MyPy 的方法,并获取一些推断的信息——或者一些我没有想到的替代解决方案。

4

1 回答 1

4

Mypy 目前有一个非常原始的、简单的 API,您可以在此处的源代码中找到“文档化”:https ://github.com/python/mypy/blob/master/mypy/api.py 。要使用它,您基本上需要将您的字符串写入一个临时文件,然后再进行清理。

您也许可以将它与reveal_type(...)特殊指令(甚至可能是隐藏--shadow-file选项)结合起来对您的字符串进行类型检查。

另一种选择是逆向工程并重新实现mypy 的 main.py 的片段,实质上是劫持了它们的内部 API。我真的不认为这会很难,只是有点丑陋和脆弱。

(请注意,mypy 理论上可以支持对任意字符串进行类型检查,并且核心开发人员原则上并不反对为 mypy 扩展 API——只是 mypy 仍在积极开发中,这意味着实现 API 的优先级很低。而现在。由于 mypy 仍在积极开发/扩展中,开发人员有点不愿意承诺实现他们随后必须支持的更复杂的 API。您可以找到有关当前状态的更多上下文和详细信息mypy 的问题跟踪器中的 API。)

于 2017-06-26T19:07:03.070 回答