【问题标题】:How to get type annotation from stub files (.pyi) at runtime in Python?如何在 Python 运行时从存根文件(.pyi)中获取类型注释?
【发布时间】:2017-08-23 02:52:19
【问题描述】:

我想获取函数或类方法的注解。如果源代码中写了类型提示,那么我可以通过获取属性__annotations__来获取类型。

def hoge(n: int): ...
print(hoge.__annotations__)  # {'n': <class 'int'>}

但我不知道如何获取写入存根文件 (.pyi) 中的类型。

# .pyi
def fuga(n: int): ...

# .py
def fuga(n): ...
print(fuga.__annotations__)  # {}

有什么很酷的方法吗?

【问题讨论】:

    标签: python python-3.x type-hinting


    【解决方案1】:

    来自PEP-484

    存根文件是包含类型提示的文件,仅供类型检查器使用,而不是在运行时使用。存根文件有几个用例:

    • 扩展模块
    • 作者尚未添加类型提示的第三方模块
    • 尚未为其编写类型提示的标准库模块
    • 必须与 Python 2 和 3 兼容的模块
    • 将注释用于其他目的的模块

    不幸的是,没有办法获取注释,它们的解释方式由类型检查器自行决定。这样做的副作用是没有权威资源来验证您的类型提示是否正确。

    最接近的是mypy

    【讨论】:

    • 梅尔文,你的意见是对的。官方不支持在运行时从存根文件中获取类型的方式。但是,我认为它可以通过某种方法获得,并提出了一个问题。 mypy 似乎创建了语法树并获取类型提示。如果我们在运行时获取语法树并将其与存根文件的语法树进行比较,就可以得到类型提示。但是,我放弃了,因为它太难了。谢谢。
    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2017-09-24
    • 2019-06-29
    • 2020-03-21
    • 2021-11-09
    • 2016-11-10
    • 2021-06-09
    • 2020-09-15
    相关资源
    最近更新 更多