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

问题描述 投票:1回答:2

当在运行时函数的注解检查,可以得到注释对于给定参数的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和这样此字符串。但我不知道是否有更好的方法。

python reflection annotations
2个回答
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
投票

annotations模块使用__future__功能。

>>> from __future__ import annotations
>>> def f(x:int): pass
...
>>> f.__annotations__
{'x': 'int'}

然而,这并没有介绍到的Python 3.7。见PEP-563以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.