TypeError: isinstance() arg 2 必须是类型、类型元组或联合

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”的主要原因有两个:

  1. 检查对象是否是多个类之一的子类时,传递列表而不是元组。
  2. 通过声明具有相同名称的变量来隐藏内置类,例如
    list.

typeerror isinstance arg 2 必须是元组或联合类型

将列表而不是元组传递给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 必须是类型、类型元组或联合”:

  1. 确保仅传递一个类或类的元组作为第二个参数。isinstance()函数。
  2. 确保不要通过声明具有相同名称的变量来隐藏内置类。

额外资源

您可以通过查看以下教程来了解有关相关主题的更多信息: