在运行时检查函数的注释时,可以为给定的参数获取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
等处理此字符串。但我想知道是否有更好的方法。
答案 0 :(得分:2)
每个参数对象的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
答案 1 :(得分:1)
使用calculatedArray[55] = calculcate(155);
模块中的annotations
功能。
__future__
但是,直到Python 3.7才引入。有关更多信息,请参见PEP-563。