โมดูล 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 นี้แล้วเหมือนนักพัฒนามืออาชีพ!