Chuyển đến nội dung chính

Cách khắc phục lỗi builtin_function_or_method' object is not subscriptable

Để khắc phục lỗi "'builtin_function_or_method' object is not subscriptable", hãy đảm bảo bạn gọi hàm hoặc phương thức bằng dấu ngoặc tròn () thay vì ngoặc vuông [].
· 6 phút đọc

Khám phá cùng AI

Trong Python, một thông báo lỗi thường gặp là:

'builtin_function_or_method' object is not subscriptable

Python đưa ra lỗi này khi một hàm hoặc phương thức được theo sau bởi ký hiệu ngoặc vuông []. Tuy nhiên, hàm là các đối tượng có thể gọi (callable). Do đó, chúng cần dấu ngoặc tròn (), đôi khi còn gọi là ngoặc đơn.

Hãy xem một ví dụ nơi Python báo lỗi này:

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

Phần sau sẽ phân tích lỗi này chi tiết hơn.

Tìm hiểu lỗi

Hàm trong Python là các đối tượng có thể gọi, nghĩa là chúng ta có thể dùng dấu ngoặc tròn sau tên hàm để thực thi đoạn mã trong định nghĩa hàm. Một ví dụ phổ biến về hàm dựng sẵn trong Python là print():

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

Dấu ngoặc tròn được dùng để gọi hàm trong Python. Tuy nhiên, dùng ngoặc vuông thay cho ngoặc tròn sẽ gây lỗi:

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

Hãy tách thông báo lỗi thành các phần chính:

  • Một đối tượng 'builtin_function_or_method'
  • Không thể lập chỉ mục bằng ngoặc vuông (not subscriptable)

Trong ví dụ trên, print() là một hàm dựng sẵn. Mô tả cũng nhắc đến phương thức, là các hàm thuộc về một lớp. Python có nhiều phương thức dựng sẵn gắn với các kiểu dữ liệu của nó. Hãy xem một ví dụ khác cũng gây ra lỗi này:

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

Phương thức .count(), cũng như các hàm nói chung, cần dấu ngoặc tròn:

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

Tình huống này tương tự ví dụ ở phần mở đầu, với phương thức danh sách .append(). Dưới đây là phiên bản đúng dùng ngoặc tròn:

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

TypeError: 'function' object is not subscriptable

Python cũng đưa ra lỗi tương tự với các hàm do người dùng định nghĩa:

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

Tuy nhiên, hàm greet_person() không phải là hàm dựng sẵn của Python. Thông báo lỗi cho biết đây là một 'function' chứ không phải 'builtin_function_or_method'.

Phần thứ hai của thông báo lỗi đề cập đến thuật ngữ 'subscriptable'. Một đối tượng Python là subscriptable nếu chúng ta có thể dùng ngoặc vuông để truy cập một phần tử của nó. Ví dụ phổ biến về đối tượng subscriptable là sequence, có thể được lập chỉ mục bằng ngoặc vuông:

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

Tuple và string là những ví dụ khác của sequence. Vì vậy, chúng cũng là subscriptable:

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

Các mapping trong Python cũng là subscriptable. Mapping phổ biến nhất trong Python là dictionary:

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

Khóa của dictionary được dùng thay cho chỉ số trong ngoặc vuông.

Python: Callable vs. Subscriptable

Sequence và mapping là những ví dụ về các đối tượng Python subscriptable. Chúng ta có thể dùng ngoặc vuông sau tên đối tượng để truy cập một đối tượng bên trong cấu trúc dữ liệu. Một lớp Python tạo ra các đối tượng subscriptable nếu nó định nghĩa phương thức đặc biệt .__getitem__().

Hàm và phương thức là ví dụ về các đối tượng có thể gọi (callable). Chúng ta có thể dùng ngoặc tròn sau tên đối tượng để gọi chúng. Gọi một hàm hoặc phương thức sẽ thực thi mã trong định nghĩa hàm.

Lớp cũng là một đối tượng có thể gọi trong Python. Gọi một lớp sẽ tạo ra một thể hiện. Nhìn chung, một đối tượng Python là callable nếu lớp của nó định nghĩa phương thức đặc biệt .__call__().

Python đưa ra thông báo lỗi tương tự khi chúng ta cố gọi một đối tượng không thể gọi:

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

Biến numbers là một danh sách, vốn không thể gọi. Cách đúng để truy cập phần tử đầu tiên của danh sách là dùng ngoặc vuông: numbers[0]. Hàm, phương thức và lớp là các đối tượng callable phổ biến nhất trong Python.

Khắc phục lỗi 'builtin_function_or_method' object is not subscriptable

Python đưa ra thông báo lỗi ``'builtin_function_or_method' object is not subscriptable` khi một hàm hoặc phương thức được theo sau bởi ngoặc vuông. Hãy chú ý các ngoặc vuông ngay sau tên hàm hoặc phương thức và thay chúng bằng ngoặc tròn.

Trong một số trường hợp, một hàm hoặc phương thức có một danh sách làm đối số, được định nghĩa bằng ngoặc vuông. Tuy nhiên, lưu ý rằng danh sách được định nghĩa bên trong ngoặc tròn:

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]

Trong các ví dụ này, tên hàm hoặc phương thức được theo sau bởi ngoặc tròn. Đối số bên trong ngoặc tròn là một danh sách. Ký hiệu ngoặc vuông để định nghĩa danh sách khác với ký hiệu ngoặc vuông dùng với sequence, mapping và các đối tượng subscriptable khác.

Mẹo gỡ lỗi

Một việc bạn có thể làm là kiểm tra kiểu đối tượng bằng hàm dựng sẵn type():

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

Kết quả xác nhận rằng đối tượng là một hàm hoặc phương thức dựng sẵn, tức là có thể gọi. Cũng có một hàm dựng sẵn tên callable() trả về True nếu đối số của nó có thể gọi được:

print(callable(numbers.append))
True

Các mẹo gỡ lỗi khác cần cân nhắc:

  • Kiểm tra loại ngoặc. Các đối tượng callable như hàm và phương thức cần được theo sau bởi ngoặc tròn. Ngoặc vuông dùng cho sequence, mapping và các đối tượng subscriptable khác.
  • Tìm manh mối trong thông báo lỗi về các hàm hoặc phương thức dựng sẵn và các đối tượng subscriptable. Số dòng trong thông báo lỗi chỉ ra dòng chứa lỗi.

Kết luận

Các ngôn ngữ lập trình như Python dùng những ký hiệu khác nhau cho các mục đích khác nhau. Ngoặc vuông được dùng ngay sau tên đối tượng để truy cập một phần tử từ cấu trúc dữ liệu. Ký hiệu ngoặc vuông này hoạt động với các đối tượng subscriptable. Ngoặc vuông cũng được dùng để tạo danh sách khi chúng không đứng ngay sau tên đối tượng.

Ngoặc tròn được dùng sau tên đối tượng để gọi đối tượng. Hàm và phương thức là ví dụ về các đối tượng callable trong Python. Ngoặc tròn cũng gắn với tuple trong Python và được dùng để nhóm các phần của một biểu thức khi cần.

Python sẽ ném ngoại lệ 'builtin_function_or_method' object is not subscriptable khi một hàm hoặc phương thức dựng sẵn được theo sau bởi ngoặc vuông. Cách đúng để gọi một hàm hoặc phương thức là dùng ngoặc tròn.

Bạn có thể đọc thêm về hàm trong bài viết Python Functions: How to Call & Write Functions của DataCamp.

Stephen Gruppetta

Tác giả

Stephen Gruppetta

Tôi học Vật lý và Toán ở bậc đại học tại Đại học Malta. Sau đó, tôi chuyển đến London và lấy bằng Tiến sĩ Vật lý tại Imperial College. Tôi nghiên cứu các kỹ thuật quang học mới để chụp ảnh võng mạc người. Hiện nay, tôi tập trung vào việc viết về Python, truyền đạt về Python và giảng dạy Python.

Chủ đề

Liên quan