我有一些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,并获得一些推断的信息 - 或者我没有想到的一些替代解决方案。
答案 0 :(得分:3)
Mypy目前有一个非常原始的,简单的API,您可以在源代码中找到“记录”:https://github.com/python/mypy/blob/master/mypy/api.py。要使用它,您基本上需要将您的字符串写入临时文件,以便稍后清理。
你可以将它与reveal_type(...)
特殊指令(甚至可能是hidden --shadow-file
选项)结合起来来检查你的字符串。
另一种选择是反向工程并重新实现mypy's main.py的部分,基本上劫持其内部API。我并不认为这会很难,只是有些丑陋和脆弱。
(请注意,mypy理论上可以支持对任意字符串进行类型检查,并且核心开发人员原则上不反对为mypy扩展API - 只是mypy仍处于活跃开发阶段,这意味着实现API非常低现在优先级。由于mypy仍在积极地进行工作/扩展,开发人员有点不愿意承诺实现他们随后必须支持的更复杂的API。您可以找到更多关于当前的上下文和详细信息mypy的问题跟踪器中API的状态。)