用于检查返回类型的Python decorator:特别是检查诸如List[List[str]]

用于检查返回类型的Python decorator:特别是检查诸如List[List[str]],python,python-3.x,python-decorators,python-typing,Python,Python 3.x,Python Decorators,Python Typing,我正在尝试编写一个python修饰符来进行类型检查。它工作正常,但难以处理嵌套类型提示。比如说 @类型检查 def fun(x:int)->List[List[List[str]]: 返回[[str(x)]] 乐趣(x=42) 我有一个decorator,它开发函数并检查实际返回值是否具有预期类型: 导入检查 #室内装饰 实际结果=func(*args,**kwargs)#[['42']] 预期的_结果_type=spec.annotations['return']#typing.List[t

我正在尝试编写一个python修饰符来进行类型检查。它工作正常,但难以处理嵌套类型提示。比如说

@类型检查
def fun(x:int)->List[List[List[str]]:
返回[[str(x)]]
乐趣(x=42)
我有一个decorator,它开发函数并检查实际返回值是否具有预期类型:

导入检查
#室内装饰
实际结果=func(*args,**kwargs)#[['42']]
预期的_结果_type=spec.annotations['return']#typing.List[typing.List[typing.List[str]]
现在的挑战是检查is
[[['42']]
是否有类型
typing.List[typing.List[typing.List[typing.List[str]]
。 我该怎么做

我发现,
[[['42']]
只是简单地键入了
,它完全忽略了有关嵌套的信息。 我可以和你核对一下

if hasattr(预期的结果类型,'.'原点'):
预期结果类型=预期结果类型__
如果预期结果类型不是无:
断言isinstance(结果,预期结果类型)
否则:#没有一个是特例
断言结果应为\u结果\u类型

这适用于“外层”,但忽略嵌套类型提示。有没有办法检查所有图层?

简单的答案是:

只需递归到所有参数中,如:

def类型检查(值、注释):
如果isinstance(注释,类型):
返回isinstance(值、注释)
elif annotation==typing.T或annotation==typing.Any:
返回真值
elif isinstance(注释、键入._GenericAlias):
如果注释.\uuuuu原点\uuuuu==列表:
如果不存在(值,列表):
返回错误
内部注释=注释。\uuuu参数\uuuu[0]
返回值中val的全部(键入检查(val,内部注释)
范例

>类型检查(5,int)
真的
>>>键入检查([1,2,3],键入.List[int])
真的
>>>键入检查([1,2,3],键入.List[float])
假的
你可以简单地用在你的装饰上。处理Dict、Tuple和其他常见类型可能会有所改进

然而,这只是一个简单的例子,如果你想做健壮的动态类型检查,你必须处理
生成器
可调用
迭代器
等等。。。这不仅非常复杂,而且在某些情况下是完全不可能的(例如,除非迭代,否则无法检查迭代器)

请看一看,这就是:使用decorator的python动态类型检查。
输入
模块的源代码阅读起来也很有趣,但它确实突破了动态内省的极限


希望有帮助;)

简单的答案是:

只需递归到所有参数中,如:

def类型检查(值、注释):
如果isinstance(注释,类型):
返回isinstance(值、注释)
elif annotation==typing.T或annotation==typing.Any:
返回真值
elif isinstance(注释、键入._GenericAlias):
如果注释.\uuuuu原点\uuuuu==列表:
如果不存在(值,列表):
返回错误
内部注释=注释。\uuuu参数\uuuu[0]
返回值中val的全部(键入检查(val,内部注释)
范例

>类型检查(5,int)
真的
>>>键入检查([1,2,3],键入.List[int])
真的
>>>键入检查([1,2,3],键入.List[float])
假的
你可以简单地用在你的装饰上。处理Dict、Tuple和其他常见类型可能会有所改进

然而,这只是一个简单的例子,如果你想做健壮的动态类型检查,你必须处理
生成器
可调用
迭代器
等等。。。这不仅非常复杂,而且在某些情况下是完全不可能的(例如,除非迭代,否则无法检查迭代器)

请看一看,这就是:使用decorator的python动态类型检查。
输入
模块的源代码阅读起来也很有趣,但它确实突破了动态内省的极限

希望有帮助;)