inspect.Parameter.annotation方法为导入的方法返回一个字符串,而不是在作用域中定义的类型.&l



考虑以下python文件test.py:

def accepts_string(s: str):
pass

如果我打开一个python shell,导入这个函数,然后抓住函数的参数s和它的注释,我得到一个字符串字面值。

>>> import inspect
>>> from test import accepts_string
>>> inspect.signature(accepts_string).parameters['s'].annotation
'str'

但是,如果我在shell中定义这个函数-我将得到一个实际的"类类型"的预期结果。

>>> import inspect
>>> def accepts_string(s: str):
...    pass
...
>>> inspect.signature(accepts_string).parameters['s'].annotation
<class 'str'>    

我希望总是得到后面的结果,但我在协调基于函数是导入还是实时定义的不同结果时遇到了麻烦。

这个问题是由于缺乏了解from __future__ import annotations在做什么。这包含在我的文件的顶部,从我给出的初始示例中省略了。很抱歉在发这篇文章的时候没有意识到这一点。

正如一位用户在评论中指出的:

未来行为将成为默认行为,它应该在Python 3.10中,但它被延迟了,不确定当前状态

我想无论如何我都需要使用typing.get_type_hints来可靠地抓取未来python版本的函数注释。

最新更新