考虑以下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版本的函数注释。