gpt4 book ai didi

python - 如何使用 typing Python 模块执行类型检查?

转载 作者:太空狗 更新时间:2023-10-29 21:09:34 25 4
gpt4 key购买 nike

我正在阅读 typing模块代码并查看 mypy了解它如何进行类型检查。对我来说不幸的是,mypy 使用我仍然不理解的类型化表达式构建了一个非常智能的树,并且它全部基于静态分析。

我想在 Python 中实现一个动态的(无静态分析)类型检查系统。假设执行类型检查的函数称为 check_type,我想完成以下操作:

>>> import typing
>>>
>>> check_type(1, int)
True
>>> check_type(1, float)
False
>>> check_type([1], typing.List[int])
True
>>> check_type([1], typing.List[float])
False
>>> check_type([1], typing.List[typing.Any])
True
>>> check_type((1,), typing.Tuple[int])
True

我考虑过从它的值重新创建对象类型,例如:

>>> get_type([1])
typing.List<~T>[int]

但这不适用于issubclass:

>>> issubclass(typing.List[int], typing.List[typing.Any])
False

如果不假设很多关于 the internals of the typing stdlib module 的事情,我没有看到在 Python 中检查类型的简单方法。 (例如,访问 __args____tuple_params__)。

我如何才能正确实现适用于前面列出的案例的 check_type 函数?我正在使用 Python 2.7。

最佳答案

对于问题中提供的简单示例,您可以轻松获得能够正常工作的非常有限的功能:

import mypy.api

def check_type(value, typ):
program_text = 'from typing import *; v: {} = {}'.format(typ, repr(value))
normal_report, error_report, exit_code = mypy.api.run(['-c', program_text])
return exit_code == 0

int_ = 1
str_ = 'a'
list_str_ = ['a']
list_int_ = [1]
tuple_int_ = (1,)

assert check_type(int_, 'int')
assert not check_type(str_, 'int')
assert check_type(list_int_, 'List[int]')
assert not check_type(list_str_, 'List[int]')
assert check_type(list_int_, 'List[Any]')
assert check_type(tuple_int_, 'Tuple[int]')

你甚至可以通过稍微扩展这段代码来做一些更高级的事情(例如,引用与你在程序中定义的类对应的类型),这样 mypy 就可以解析你的整个源代码,而不是仅仅解析当前行。

或者,您可能想查看 enforcetypeguard .

关于python - 如何使用 typing Python 模块执行类型检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com