是否存在类似isinstance的函数可校验list[int]这类混合类型数据?
泛型类型校验函数实现方案
Python 原生的isinstance不支持直接校验list[int]这类带参数的泛型类型,运行时直接调用会抛出TypeError: isinstance() argument 2 cannot be a parameterized generic错误,你可以自行封装isinstance2函数实现需求,实现方案如下:
from typing import get_origin, get_args def isinstance2(obj, type_hint): # 获取泛型的原始类型,例如list[int]的原始类型为list origin = get_origin(type_hint) # 非泛型类型直接调用原生isinstance判断 if origin is None: return isinstance(obj, type_hint) # 优先校验外层容器类型 if not isinstance(obj, origin): return False # 获取泛型参数,例如list[int]的参数为 (int,) args = get_args(type_hint) if not args: return True # 单参数容器(list、set、tuple等)的元素类型校验 element_type = args[0] # 空容器默认返回True,如需空容器返回False可打开下一行注释 # if not obj: return False # 递归校验所有元素类型,支持嵌套泛型如list[list[int]] for element in obj: if not isinstance2(element, element_type): return False # 如需支持dict类型校验,可补充如下逻辑: # if origin is dict: # key_type, value_type = args # for k, v in obj.items(): # if not isinstance2(k, key_type) or not isinstance2(v, value_type): # return False return True
效果测试
按照你给出的用例测试,输出符合预期:
data = [1, 2, 3] data2 = {'a', 'b', 'c'} print(isinstance2(data, list[int])) # 输出 True print(isinstance2(data2, list[int])) # 输出 False print(isinstance2(data2, set[str])) # 输出 True
场景适配
你提到的类实例化类型校验场景可以直接使用该函数,示例如下:
class Foo: def __init__(self, data): if isinstance2(data, list[str]): # 对应业务逻辑 pass else: raise TypeError("参数必须为字符串类型的列表")
内容的提问来源于stack exchange,提问作者user16527495
相关产品推荐
相关产品推荐

