首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取'readable‘格式的函数批注

获取'readable‘格式的函数批注
EN

Stack Overflow用户
提问于 2019-02-07 05:31:07
回答 2查看 135关注 0票数 1

当在运行时检查函数的注释时,可以获得为给定参数注释的class。例如:

代码语言:javascript
复制
>>> import inspect
>>> inspect.signature(f).parameters['a'].annotation
<class 'int'>

同样,也可以通过执行f.__annotations__来实现。

但是,出于我不想让读者阅读的原因,我希望获得可读文本格式的注释。例如:a: int将作为int检索,而不是作为<class 'int'>检索。假设文本作为eval的输入应该是合法的。

我知道我能做到:

代码语言:javascript
复制
>>> str(inspect.signature(f).parameters['a'])
'a:int'

然后使用.split等来处理这个字符串。但我想知道有没有更好的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-07 05:36:08

每个参数对象的annotation属性都是一个类对象,因此您可以简单地使用类对象的__name__属性来获取字符串形式的类名:

代码语言:javascript
复制
import inspect

def f(a: int):
    pass

print(inspect.signature(f).parameters['a'].annotation.__name__)

这将输出以下内容:

代码语言:javascript
复制
int

但正如@chepner指出的那样,如果annotation属性是一个正向引用,那么它可以是一个字符串,所以如果你想让你的代码是泛型的,你就必须考虑到这一点。例如:

代码语言:javascript
复制
class A:
    def f(self, a: 'A'):
        pass

annotation = inspect.signature(A.f).parameters['a'].annotation
print(annotation.__name__ if isinstance(annotation, type) else annotation)

这将输出以下内容:

代码语言:javascript
复制
A
票数 3
EN

Stack Overflow用户

发布于 2019-02-07 05:34:33

使用__future__模块中的annotations功能。

代码语言:javascript
复制
>>> from __future__ import annotations
>>> def f(x:int): pass
...
>>> f.__annotations__
{'x': 'int'}

然而,这直到Python3.7才被引入。有关详细信息,请参阅PEP-563

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54562827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档