【问题标题】:Get types in Python expression using MyPy as library使用 MyPy 作为库获取 Python 表达式中的类型
【发布时间】:2017-06-26 11:37:51
【问题描述】:

我有一些 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 code 这样的 IDE 已经变得非常擅长猜测 python 代码中的类型,这就是为什么我猜测肯定有一种公开的方式来做到这一点。

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

【问题讨论】:

  • 您也许可以使用inspect 模块。它是一个 Python 内省助手。
  • 我很困惑,你不能只使用type() 函数吗?
  • 我将代码作为字符串,我不想执行它。我想获取源代码中包含的变量的类型。

标签: python type-inference mypy


【解决方案1】:

Mypy 目前有一个极其原始的、简单的 API,您可以在此处的源代码中找到“已记录”的 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 的状态。)

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 2022-01-22
    • 2023-03-10
    • 2021-02-16
    • 2021-12-17
    • 2012-08-28
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多