求助:issubclass()触发TypeError:参数1必须是类的问题排查
TypeError: issubclass() arg 1必须是类 错误分析与解决方法
错误场景
执行以下代码时触发TypeError:
def __subclasscheck__(self, cls): if isinstance(cls, _SpecialGenericAlias): return issubclass(cls.__origin__, self.__origin__) if not isinstance(cls, _GenericAlias): return issubclass(cls, self.__origin__) return super().__subclasscheck__(cls)
错误信息:
TypeError: issubclass() arg 1 must be a class
错误原因
issubclass()函数要求第一个参数必须是类对象(即type的实例),当前代码存在两种触发错误的可能:
- 当
cls是_GenericAlias之外的类型时,cls本身不是类对象(比如是实例、None或其他非类类型),直接传入issubclass导致报错。 - 当
cls是_SpecialGenericAlias类型时,cls.__origin__可能不是类对象,传入issubclass后触发错误。
解决方法
在调用issubclass()之前,先验证第一个参数是否为类对象(用isinstance(item, type)判断),避免传入非法参数。修改后的代码如下:
def __subclasscheck__(self, cls): # 先确认自身的__origin__是类,否则直接返回False self_origin = self.__origin__ if not isinstance(self_origin, type): return False if isinstance(cls, _SpecialGenericAlias): origin_cls = cls.__origin__ # 验证cls.__origin__是类后再调用issubclass if isinstance(origin_cls, type): return issubclass(origin_cls, self_origin) return False if not isinstance(cls, _GenericAlias): # 验证cls是类后再调用issubclass if isinstance(cls, type): return issubclass(cls, self_origin) return False return super().__subclasscheck__(cls)
补充说明
- 如果业务逻辑要求非类对象必须抛出错误而非返回
False,可以将return False替换为raise TypeError("参数必须是类")。 - 额外检查
self.__origin__是为了避免自身的__origin__非法导致的后续错误,提升代码健壮性。
内容的提问来源于stack exchange,提问作者saurabh kumar
相关产品推荐
相关产品推荐

