修复 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
也可能在使用预定义名称命名变量时遇到。一些最常被误用的可能导致此类错误的内置名称包括: str
、dict
、list
和 range
。
在 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
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。
在 Django 中创建对象
发布时间:2023/05/04 浏览次数:59 分类:Python
-
本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。
在 Django 中为多项选择创建字段
发布时间:2023/05/04 浏览次数:75 分类:Python
-
在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。