当在运行时函数的注解检查,可以得到注释对于给定参数的class
。例如:
>>> import inspect
>>> inspect.signature(f).parameters['a'].annotation
<class 'int'>
同样可以通过做f.__annotations__
来实现。
但是,对于原因,我将不遗余力的读者,我想获得以可读的文本格式的注释。例如:a: int
将被检索作为int
,而不是作为<class 'int'>
。假设文本应该是合法的,因为输入eval
。
我知道我可以这样做:
>>> str(inspect.signature(f).parameters['a'])
'a:int'
然后处理使用.split
和这样此字符串。但我不知道是否有更好的方法。
每个参数对象的annotation
属性是一个类的对象,所以你可以简单地使用类对象的属性__name__
获得类名作为字符串:
import inspect
def f(a: int):
pass
print(inspect.signature(f).parameters['a'].annotation.__name__)
这种输出:
int
但随着@chepner指出的那样,annotation
属性可以是一个字符串,如果它是一个正向基准,所以如果你想你的代码是通用的,你就必须考虑到这一点。例如:
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)
这种输出:
A
从annotations
模块使用__future__
功能。
>>> from __future__ import annotations
>>> def f(x:int): pass
...
>>> f.__annotations__
{'x': 'int'}
然而,这并没有介绍到的Python 3.7。见PEP-563以获取更多信息。