Computer >> Máy Tính >  >> Lập trình >> Python

Python TypeError:Đối tượng ‘mô-đun’ không thể gọi được Giải pháp

Các mô-đun Python rất khó hiểu, đặc biệt là khi bạn định nghĩa mô-đun của riêng mình. “TypeError:Đối tượng‘ module ’không thể gọi được” là một trong những lỗi phổ biến nhất mà các nhà phát triển Python mắc phải khi làm việc với các lớp.

Trong hướng dẫn này, chúng tôi nói về lỗi này có nghĩa là gì và tại sao nó lại xuất hiện. Chúng tôi xem qua một đoạn mã mẫu để giúp bạn khắc phục lỗi này. Hãy bắt đầu!

Sự cố:TypeError:đối tượng ‘module’ không thể gọi được

Bất kỳ tệp Python nào cũng là một mô-đun miễn là nó kết thúc bằng phần mở rộng “.py”.

Mô-đun là một phần quan trọng của Python vì chúng cho phép bạn xác định các hàm, biến và lớp bên ngoài chương trình chính. Điều này có nghĩa là bạn có thể chia mã của mình thành nhiều tệp và phân loại nó hiệu quả hơn.

Các mô-đun phải được nhập theo một cách nhất định. Nếu không, Python trả về một lỗi:

TypeError: 'module' object is not callable

Điều này xảy ra khi bạn cố gắng nhập một mô-đun dưới dạng một hàm.

Một tình huống mẫu

Xác định một mô-đun được gọi là "bánh". Mô-đun này chứa một hàm:read_file. Hàm read_file sẽ đọc nội dung của một tệp văn bản.

Tên tệp của chúng tôi xác định tên của mô-đun của chúng tôi. Bởi vì chúng tôi muốn mô-đun của mình được gọi là “bánh”, chúng tôi viết mã của mình trong một tệp có tên là cake.py:

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia chương trình đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

def read_file():
	all_cakes = []
	with open("cakes.txt", "r") as cake_file:
		cake_list = cake_file.readlines()
		for c in cake_list:
			all_cakes.append(c.replace("\n", ""))

	return all_cakes

Chức năng này đọc nội dung của một tệp có tên "cake.txt". Sau đó, nó lặp lại từng dòng văn bản trong tệp và thêm từng dòng vào danh sách có tên “all_cakes”.

Phương thức Replace () được sử dụng để thay thế mọi ký tự dòng (“\ n”) mới bằng giá trị trống. Thao tác này sẽ xóa tất cả các dòng mới. Chúng tôi trả về “all_cakes” ở cuối hàm của chúng tôi.

Bây giờ, hãy mở một tệp có tên app.py và dán mã này vào:

import cakes

cake_list = cakes()
print(cake_list)

Mã này sử dụng mô-đun “bánh” của chúng tôi để đọc nội dung của tệp “bánh.txt”. Sau đó, nó sẽ in ra tất cả các bánh mà hàm đã tìm thấy trong tệp.

Hãy chạy mã của chúng tôi:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
	cakes = cakes()
TypeError: 'module' object is not callable

Mã của chúng tôi trả về lỗi.

Giải pháp

Hãy xem báo cáo nhập trong tệp app.py của chúng tôi:

import cakes

Chúng tôi nhập mô-đun "bánh". Điều này chứa tất cả các biến, lớp và hàm mà chúng tôi khai báo trong tệp “cake.py”.

Bây giờ, hãy xem dòng mã tiếp theo của chúng ta:

cake_list = cakes()

Mặc dù mô-đun "bánh" chỉ chứa một chức năng, chúng tôi không chỉ định chức năng đó là gì. Điều này khiến Python bối rối vì nó không biết nó phải hoạt động với chức năng nào.

Để giải quyết lỗi này, chúng tôi gọi tên của hàm mà chúng tôi muốn tham chiếu thay vì chính mô-đun:

import cakes

cake_list = cakes.read_file()
print(cake_list)

Hãy thử chạy lại mã của chúng tôi:

['Cinnamon Babka', 'Chocolate Cupcake']

Mã của chúng tôi trả về thành công danh sách các loại bánh.

Trong tệp app.py của chúng tôi, chúng tôi gọi là cake.read_file ().

Python xem xét tệp “bread.py” nơi lưu trữ mô-đun “bánh” của chúng tôi và định vị read_file() chức năng. Sau đó, Python thực thi chức năng đó.

Chúng tôi gán kết quả của read_file() hàm cho một biến được gọi là "cake_list". Sau đó, chúng tôi in danh sách đó ra bảng điều khiển.

Ngoài ra, nhập trực tiếp hàm read_file vào chương trình của chúng tôi:

from cakes import read_file

cake_list = read_file()
print(cake_list)

Mã của chúng tôi trả về:

['Cinnamon Babka', 'Chocolate Cupcake']

Mã của chúng tôi thực thi read_file() chức năng từ mô-đun "bánh". Trong ví dụ này, chúng tôi nhập toàn bộ mô-đun "bánh". Thay vì làm như vậy, chúng tôi nhập một hàm từ mô-đun “bánh”:read_file.

Lưu ý rằng khi chúng tôi nhập read_file, chúng tôi không cần sử dụng cakes.read_file() nữa để gọi hàm của chúng tôi. Chúng tôi sử dụng read_file() bởi vì chúng tôi nhập read_file() hoạt động trực tiếp vào mã của chúng tôi.



Kết luận

Mã cho mô-đun Python tồn tại trong một tệp khác. Có một số cách khác nhau để nhập các chức năng và giá trị từ các mô-đun và rất dễ gây nhầm lẫn.

Khi bạn làm việc với các mô-đun, hãy đảm bảo rằng bạn tham chiếu các hàm, lớp và biến mà bạn muốn truy cập một cách chính xác. Bạn cần chỉ định chức năng chính xác mà bạn muốn gọi từ một mô-đun nếu bạn muốn tham chiếu đến một chức năng, thay vì gọi chính mô-đun đó.

Bây giờ, bạn đã sẵn sàng để giải quyết Python TypeError này như một nhà phát triển chuyên nghiệp!