修复 Python 中不可调用的错误列表对象

Isaac Tony 2022年5月17日
修复 Python 中不可调用的错误列表对象

类型错误是 Python 程序中一些常见的标准异常。它们通常是由于未能遵守正确的语法或对不受支持的数据类型进行的操作造成的。

当我们试图调用一个不可调用的对象时,经常会出现这个错误,就像我们调用一个普通的函数对象一样。由于违反了正确的 python 语法,下面的代码片段返回一个 TypeError。

nums = [23, 34, 56, 67]
nums()

输出:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: 'list' object is not callable

如果后面的一对括号可以触发对象的执行,则对象被认为是可调用的,就像函数一样。

幸运的是,Python 标准还提供了 callable() 函数,如果对象出现可调用则返回 True,如果对象不可调用则返回 False

在列表上方的示例中,对象是不可调用的,因此我们肯定会得到 False。

nums = [23, 34, 56, 67]
print(callable(nums))

输出:

False

函数、方法和类在 Python 中是可调用的。

这是因为可以使用执行运算符调用它们的执行。Python 中的可调用对象列表包括 lambda 函数和自定义的可调用对象。

另一方面,元组、列表和字典等数据类型是不可调用的。因此,任何将它们作为 Python 中的普通函数或方法执行的尝试都会导致 TypeError: object is not callable

当使用括号而不是方括号从列表中索引元素时,也可能会出现 TypeError list object not callable

在大多数编程语言中,方括号被认为是默认的索引运算符。然而,在编写程序时,我们可能经常发现自己使用括号代替方括号,因为它们非常相似。

下面的代码片段旨在返回列表中索引 2 处的元素。

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars(2))

输出:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: 'list' object is not callable

虽然新手经常犯这种错误,但即使是经验丰富的开发人员,这也是常见的语法错误。这个错误可以通过简单地使用方括号而不是括号来索引元素来解决,如下所示。

cars = ["Mazda", "Toyota", "BMW", "Tesla", "Hyundai"]
print(cars[2])

输出:

BMW

在使用列表推导来缩短 Python 语法时,可能会出现使用括号而不是方括号来执行索引的情况。这是因为列表推导涉及多个方括号和圆括号的组合,而不是通常的 Python 语法。

在下面的示例中,括号在构造列表推导时被滥用。

top_companies = [
    ["microsoft", "apple", "ibm"],
    ["tesla", "lucid", "nikola"],
    ["foxcon", "huawei", "tencent"],
]
result = [[row(index).upper() for index in range(len(row))] for row in top_companies]
print(result)

输出:

Traceback (most recent call last):
  File "<string>", line 2, in <module>
  File "<string>", line 2, in <listcomp>
  File "<string>", line 2, in <listcomp>
TypeError: 'list' object is not callable

上面的示例打算使用元素的索引遍历嵌套列表并将其元素转换为大写。为了解决这个错误,我们需要检查代码并确保我们使用方括号来索引,如下所示。

top_companies = [
    ["microsoft", "apple", "ibm"],
    ["tesla", "lucid", "nikola"],
    ["foxcon", "huawei", "tencent"],
]
result = [[row[index].upper() for index in range(len(row))] for row in top_companies]
print(result)

输出:

[['MICROSOFT', 'APPLE', 'IBM'], ['TESLA', 'LUCID', 'NIKOLA'], ['FOXCON', 'HUAWEI', 'TENCENT']]

TypeError: list object is not callable 也可能在使用预定义名称命名变量时遇到。一些最常被误用的可能导致此类错误的内置名称包括: strdictlistrange

在 Python 中,列表构造函数 list() 用于创建新列表。由于这是一个预定义的内置名称和一个表示 Python 列表的类对象,因此将名称列表用作变量名并不好。

使用名称列表来命名变量可能会导致错误列表对象不可调用,如下例所示。

list = [24, 24, 25, 26, 28, 56]

nums_range = list(range(20, 40))

for number in list:
    if number in nums_range:
        print(number, "is the range")
    else:
        print(number, "number is not in range")

输出:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
TypeError: 'list' object is not callable

在上面的示例中,我们使用了预定义的名称列表作为变量名称。我们尝试使用与构造函数相同的名称在第二行创建一个新列表。

由于我们已经将此名称用作变量名,因此 Python 将第二行解释为尝试调用列表对象,从而导致错误。

可以通过将列表对象重命名为不同的名称来解决上述错误。新名称不应该是关键字,因为它确保 list() 构造函数保留其功能属性。

nums = [23, 24, 25, 28, 27, 35, 78]

nums_range = list(range(20, 40))

for number in nums:
    if number in nums_range:
        print(number, "is the range")
    else:
        print(number, "is not in the range")

输出:

23 is the range
24 is the range
25 is the range
28 is the range
27 is the range
35 is the range
78 is not in the range
作者: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

相关文章 - Python List

相关文章 - Python Object

相关文章 - Python Error