跳至主要内容

如何修复 builtin_function_or_method' object is not subscriptable 错误

要修复 "'builtin_function_or_method' object is not subscriptable" 错误,请确保使用圆括号 () 调用函数或方法,而不是使用方括号 []。
· 6分钟 阅读

使用 AI 探索

在 Python 中,一个常见的错误信息如下:

'builtin_function_or_method' object is not subscriptable

当函数或方法后面跟着方括号 [] 表示法时,Python 会抛出此错误。然而,函数是可调用对象,因此需要使用圆括号 ()(有时也称为小括号)。

让我们看一个会引发此错误的示例:

numbers = [2, 4, 6, 8]
numbers.append[10]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

下面一节将更详细地探讨这个错误。

理解该错误

Python 函数是可调用对象,这意味着我们可以在函数名后使用圆括号来执行函数定义中的代码。Python 中最常见的内置函数之一是 print():

print("This is a built-in function")
This is a built-in function

圆括号用于在 Python 中调用函数。然而,使用方括号而不是圆括号会引发错误:

print["This is a built-in function"]
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

让我们将错误信息拆分为关键部分:

  • “builtin_function_or_method” 对象
  • 不可下标(not subscriptable)

在上面的示例中,print() 是一个内置函数。描述中还提到了方法,即属于某个类的函数。Python 为其数据类型提供了许多内置方法。再看一个会引发此错误的信息的例子:

name = "DataCamp"
print(name.count["a"])
Traceback (most recent call last):
  ...
TypeError: 'builtin_function_or_method' object is not subscriptable

与一般函数一样,.count() 方法需要使用圆括号:

print(name.count("a"))
3

这种情况与引言中的示例类似,其中包含列表方法 .append()。以下是使用圆括号的正确写法:

numbers = [2, 4, 6, 8]
numbers.append(10)
print(numbers)
[2, 4, 6, 8, 10]

TypeError: 'function' object is not subscriptable

对于用户自定义函数,Python 会抛出类似的错误:

def greet_person(name):
    print(f"Hello {person}")
   
greet_person["James"]
Traceback (most recent call last):
  ...
TypeError: 'function' object is not subscriptable

不过,函数 greet_person() 并不是 Python 的内置函数。错误信息表明这是一个 “function”,而不是 “builtin_function_or_method”。

错误信息的第二部分涉及 “subscriptable”(可下标)这一术语。如果我们可以使用方括号访问其元素,那么该 Python 对象就是可下标的。一个常见的可下标对象示例是 序列(sequence),其可以使用方括号进行索引:

print(numbers[0])
print(numbers[-1])
print(numbers[1:4])
2
10
[4, 6, 8]

元组和字符串也是序列的其他示例,因此它们同样是可下标的:

more_numbers = 10, 30, 50
print(more_numbers[0])
name = "DataCamp"
print(name[0])
10
'D'

Python 的 映射(mapping)也可下标。Python 中最常见的映射是字典:

points = {"James": 10, "Mary": 14}
print(points["Mary"])
14

在方括号中使用的是字典键,而不是索引。

Python:可调用与可下标

序列和映射是可下标的 Python 对象示例。我们可以在对象名后使用方括号,从数据结构中访问其中的对象。若某个 Python 类定义了 .__getitem__() 特殊方法,那么该类创建的对象就是可下标的。

函数和方法是可调用对象的示例。我们可以在对象名后使用圆括号来调用它们。调用函数或方法会执行函数定义中的代码。

类是另一种可调用的 Python 对象。调用类会创建其实例。一般而言,如果某个对象所属的类定义了 .__call__() 特殊方法,则该对象就是可调用的。

当我们尝试调用一个不可调用的对象时,Python 会抛出类似的错误信息:

numbers = [2, 4, 6, 8]
print(numbers(0))
Traceback (most recent call last):
  ...
TypeError: 'list' object is not callable

变量 numbers 是一个列表,不可调用。正确的方式是使用方括号访问列表的第一个元素:numbers[0]。函数、方法和类是 Python 中最常见的可调用对象。

修复 'builtin_function_or_method' object is not subscriptable

当函数或方法后面跟着方括号时,Python 会抛出 ``'builtin_function_or_method' object is not subscriptable` 错误信息。请留意函数或方法名后紧跟的方括号,并将其替换为圆括号。

在某些情况下,函数或方法的参数是一个使用方括号定义的列表。但请注意,该列表是在圆括号内定义的:

number_of_values = len([10, 30, 50])
print(number_of_values)
numbers = [2, 4, 6, 8]
numbers.extend([10, 12])
print(numbers)
3
[2, 4, 6, 8, 10, 12]

在这些示例中,函数或方法名后面跟着的是圆括号。圆括号内的参数是一个列表。用于定义列表的方括号记法,与用于序列、映射和其他可下标对象的方括号记法是不同的。

调试提示

您可以做的一件事是使用内置的 type() 函数检查对象类型:

print(type(print))
numbers = [2, 4, 6, 8]
print(type(numbers.append))
<class 'builtin_function_or_method'>

输出结果确认该对象是内置函数或方法,因此是可调用的。还有一个名为 callable() 的内置函数,如果其参数可被调用,则返回 True:

print(callable(numbers.append))
True

其他可考虑的调试提示:

  • 检查所使用的是方括号还是圆括号。可调用对象(如函数和方法)后面需要使用圆括号。方括号用于序列、映射和其他可下标对象。
  • 在错误信息中寻找与内置函数或方法以及可下标对象相关的线索。错误信息中的行号会指向包含错误的那一行。

结论

像 Python 这样的编程语言会为不同目的使用不同的符号。方括号用于紧跟在对象名后,从数据结构中访问某个元素。这种方括号记法适用于可下标对象。当方括号不紧跟在对象名后时,它也用于创建列表。

圆括号用于在对象名后调用对象。函数和方法是 Python 中可调用对象的例子。圆括号在 Python 中也与元组相关,并在需要时用于对语句的部分进行分组。

当内置函数或方法后面跟着方括号时,Python 会抛出异常 'builtin_function_or_method' object is not subscriptable。调用函数或方法的正确方式是使用圆括号。

您可以在 DataCamp 的 Python 函数:如何调用与编写函数一文中阅读更多内容。

Stephen Gruppetta

作者

Stephen Gruppetta

我在马耳他大学完成了本科阶段的物理与数学学习。随后前往伦敦,并在帝国理工学院取得物理学博士学位,研究用于成像人类视网膜的新型光学技术。现在,我专注于撰写与传播 Python 相关内容,并教授 Python。

主题