获取“可读”格式的功能注释

时间:2019-02-06 21:31:07

标签: python reflection annotations

在运行时检查函数的注释时,可以为给定的参数获取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等处理此字符串。但我想知道是否有更好的方法。

2 个答案:

答案 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