当在运行时检查函数的注释时,可以获得为给定参数注释的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等来处理这个字符串。但我想知道有没有更好的方法。
发布于 2019-02-07 05:36:08
每个参数对象的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发布于 2019-02-07 05:34:33
使用__future__模块中的annotations功能。
>>> from __future__ import annotations
>>> def f(x:int): pass
...
>>> f.__annotations__
{'x': 'int'}然而,这直到Python3.7才被引入。有关详细信息,请参阅PEP-563。
https://stackoverflow.com/questions/54562827
复制相似问题