TypeError: isinstance() arg 2 必须是类型、类型元组或联合
TypeError: isinstance() arg 2 must be a type, tuple of types, or a union
出现“TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union”的主要原因有两个:
- 检查对象是否是多个类之一的子类时,传递列表而不是元组。
- 通过声明具有相同名称的变量来隐藏内置类,例如
list
.
将列表而不是元组传递给isinstance()
下面是错误如何发生的示例。
主程序
a_list = [str, int, bool] # ⛔️ TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union result = isinstance('bobbyhadz.com', a_list)
我们将一个列表作为第二个参数传递给isinstance()
导致错误的函数。
该isinstance
函数可以传递一个类或类的元组。
将元组传递给isinstance()
函数
如果您试图检查一个对象是否是多个类之一的实例,则可以使用tuple()类将列表转换为元组。
主程序
a_list = [str, int, bool] result = isinstance('bobbyhadz.com', tuple(a_list)) print(result) # 👉️ True
如果传入的对象是传入类的实例或子类或至少是元组中的一个类,则isinstance函数返回
。True
隐藏内置类
如果通过声明同名变量来隐藏内置类,也会导致该错误。
主程序
# 👇️ this shadows built-in list class list = ['bobby', 'hadz', 'com'] numbers = [1, 2, 3] # ⛔️ TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union result = isinstance(numbers, list)
我们声明了一个名为 list 的变量,它隐藏了内置list
类。
我们最终将自己的列表作为参数传递给函数而不是内置类。
isinstance()
list
重命名变量以解决错误
要解决该错误,请重命名代码中的变量。
主程序
a_list = ['bobby', 'hadz', 'com'] numbers = [1, 2, 3] result = isinstance(numbers, list) print(result) # 👉️ True
我们将变量重命名为a_list
,因此它不再隐藏内置list
类。
使用type()
类来绕过错误
如果您无法重命名变量,请使用该类type()
。
主程序
list = ['bobby', 'hadz', 'com'] numbers = [1, 2, 3] result = isinstance(numbers, type(list)) print(result) # 👉️ True
类型
类
返回对象的类型。
主程序
print(type(['bobby', 'hadz', 'com'])) # 👉️ <class 'list'> print(type('bobbyhadz.com')) # 👉️ <class 'str'>
__class__
最常见的是,返回值与访问对象的属性相同。
您还可以将正确类型的对象传递给类type()
,它不必是隐藏内置类的变量。
主程序
list = ['bobby', 'hadz', 'com'] numbers = [1, 2, 3] result = isinstance(numbers, type([])) print(result) # 👉️ True
但是,最好的解决方案是将代码中的变量重命名为不会隐藏内置 Python 类的名称。
结论
要解决“TypeError:isinstance() arg 2 必须是类型、类型元组或联合”:
- 确保仅传递一个类或类的元组作为第二个参数。到
isinstance()
函数。 - 确保不要通过声明具有相同名称的变量来隐藏内置类。
额外资源
您可以通过查看以下教程来了解有关相关主题的更多信息: