Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python TypeError:วัตถุ 'โมดูล' ไม่สามารถเรียกได้ Solution

โมดูล Python นั้นสร้างความสับสน โดยเฉพาะเมื่อคุณกำหนดโมดูลของคุณเอง “ TypeError:วัตถุ 'โมดูล' ไม่สามารถเรียกได้” เป็นหนึ่งในข้อผิดพลาดทั่วไปที่นักพัฒนา Python ทำเมื่อทำงานกับคลาส

ในคู่มือนี้ เราจะพูดถึงความหมายของข้อผิดพลาดนี้และสาเหตุที่ทำให้เกิดข้อผิดพลาดนี้ขึ้น เราอธิบายตัวอย่างข้อมูลโค้ดเพื่อช่วยให้คุณเอาชนะข้อผิดพลาดนี้ เริ่มกันเลย!

ปัญหา:TypeError:วัตถุ 'โมดูล' ไม่สามารถเรียกได้

ไฟล์ Python ใดๆ ก็ตามเป็นโมดูลที่ต่อท้ายด้วยนามสกุล “.py”

โมดูลเป็นส่วนสำคัญของ Python เนื่องจากช่วยให้คุณสามารถกำหนดฟังก์ชัน ตัวแปร และคลาสนอกโปรแกรมหลักได้ ซึ่งหมายความว่าคุณสามารถแบ่งโค้ดของคุณออกเป็นหลายไฟล์และจัดหมวดหมู่ได้อย่างมีประสิทธิภาพมากขึ้น

ต้องนำเข้าโมดูลด้วยวิธีใดวิธีหนึ่ง มิฉะนั้น Python จะส่งคืนข้อผิดพลาด:

TypeError: 'module' object is not callable

สิ่งนี้จะเกิดขึ้นเมื่อคุณพยายามนำเข้าโมดูลเป็นฟังก์ชัน

ตัวอย่างสถานการณ์

กำหนดโมดูลที่เรียกว่า "เค้ก" โมดูลนี้มีฟังก์ชันเดียว:read_file ฟังก์ชัน read_file จะอ่านเนื้อหาของไฟล์ข้อความ

ชื่อไฟล์ของเรากำหนดชื่อของโมดูลของเรา เนื่องจากเราต้องการเรียกโมดูลของเราว่า "เค้ก" เราจึงเขียนโค้ดของเราในไฟล์ชื่อ cakes.py:

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

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

ฟังก์ชั่นนี้อ่านเนื้อหาของไฟล์ที่เรียกว่า “cakes.txt” จากนั้นจะวนซ้ำทุกบรรทัดของข้อความในไฟล์และเพิ่มแต่ละบรรทัดในรายการที่เรียกว่า “all_cakes”

วิธีการแทนที่ () ใช้เพื่อแทนที่อักขระขึ้นบรรทัดใหม่ (“\n”) ด้วยค่าว่าง สิ่งนี้จะลบบรรทัดใหม่ทั้งหมด เราส่งคืน “all_cakes” เมื่อสิ้นสุดการทำงาน

ตอนนี้ เปิดไฟล์ชื่อ app.py แล้ววางโค้ดนี้:

import cakes

cake_list = cakes()
print(cake_list)

รหัสนี้ใช้โมดูล "เค้ก" ของเราเพื่ออ่านเนื้อหาของไฟล์ "cakes.txt" จากนั้นจะพิมพ์เค้กทั้งหมดที่มีฟังก์ชันที่พบในไฟล์

เรียกใช้รหัสของเรา:

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

รหัสของเราส่งคืนข้อผิดพลาด

การแก้ปัญหา

มาดูคำสั่งนำเข้าในไฟล์ app.py ของเรา:

import cakes

เรานำเข้าโมดูล "เค้ก" ประกอบด้วยตัวแปร คลาส และฟังก์ชันทั้งหมดที่เราประกาศไว้ในไฟล์ "cakes.py"

ตอนนี้ มาดูโค้ดบรรทัดถัดไปของเรากัน:

cake_list = cakes()

แม้ว่าโมดูล "เค้ก" จะมีเพียงฟังก์ชันเดียวเท่านั้น แต่เราไม่ได้ระบุว่าฟังก์ชันนั้นคืออะไร สิ่งนี้ทำให้ Python สับสนเพราะไม่รู้ว่าควรใช้งานฟังก์ชันใด

เพื่อแก้ไขข้อผิดพลาดนี้ เราเรียกชื่อฟังก์ชันที่เราต้องการอ้างอิงแทนตัวโมดูลเอง:

import cakes

cake_list = cakes.read_file()
print(cake_list)

มาลองรันโค้ดของเราอีกครั้ง:

['Cinnamon Babka', 'Chocolate Cupcake']

รหัสของเราส่งคืนรายการเค้กสำเร็จแล้ว

ในไฟล์ app.py เราเรียก cakes.read_file()

Python ดูที่ไฟล์ “cakes.py” ที่เก็บโมดูล “cakes” ของเราและค้นหา read_file() การทำงาน. จากนั้น Python จะรันฟังก์ชันนั้น

เรากำหนดผลลัพธ์ของ read_file() ฟังก์ชั่นกับตัวแปรที่เรียกว่า “cake_list” จากนั้นเราจะพิมพ์รายการนั้นไปที่คอนโซล

หรือนำเข้าฟังก์ชัน read_file โดยตรงไปยังโปรแกรมของเรา:

from cakes import read_file

cake_list = read_file()
print(cake_list)

รหัสของเราส่งคืน:

['Cinnamon Babka', 'Chocolate Cupcake']

รหัสของเรารัน read_file() ฟังก์ชันจากโมดูล "เค้ก" ในตัวอย่างนี้ เรานำเข้าโมดูล "เค้ก" ทั้งหมด แทนที่จะทำเช่นนั้น เรานำเข้าหนึ่งฟังก์ชันจากโมดูล "เค้ก":read_file

สังเกตว่าเมื่อเรานำเข้า read_file เราไม่จำเป็นต้องใช้ cakes.read_file() อีกต่อไป เพื่อเรียกฟังก์ชันของเรา เราใช้ read_file() เพราะเรานำเข้า read_file() ลงในโค้ดของเราโดยตรง



บทสรุป

รหัสสำหรับโมดูล Python มีอยู่ในไฟล์อื่น มีหลายวิธีในการนำเข้าฟังก์ชันและค่าต่างๆ จากโมดูล และทำให้สับสนได้ง่าย

เมื่อคุณทำงานกับโมดูล ตรวจสอบให้แน่ใจว่าคุณได้อ้างอิงถึงฟังก์ชัน คลาส และตัวแปรที่คุณต้องการเข้าถึงอย่างถูกต้อง คุณต้องระบุฟังก์ชันที่แน่นอนที่คุณต้องการเรียกใช้จากโมดูล หากคุณต้องการอ้างอิงฟังก์ชัน แทนที่จะเรียกโมดูลเอง

ตอนนี้คุณพร้อมที่จะแก้ไข Python TypeError นี้แล้วเหมือนนักพัฒนามืออาชีพ!