โมดูล Python น่าหลงใหล โดยเฉพาะเมื่อคุณกำหนดเอง "TypeError: 'module' object is not callable" เป็นหนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดที่นักพัฒนา Python ทำเมื่อทำงานกับคลาส
ในคู่มือนี้ เราพูดถึงว่าข้อผิดพลาดนี้หมายถึงอะไรและทำไมมันจึงถูกยกขึ้น เราจะเดินทางผ่านชิ้นโค้ดตัวอย่างเพื่อช่วยให้คุณเอาชนะข้อผิดพลาดนี้ มาเริ่มกันเลย!
ปัญหา: TypeError: 'module' object is not callable
ไฟล์ Python ใดๆ เป็นโมดูลตราบใดที่มันลงท้ายด้วยนามสกุล ".py"
โมดูลเป็นส่วนสำคัญของ Python เพราะมันให้คุณกำหนดฟังก์ชัน ตัวแปร และคลาสภายนอกโปรแกรมหลัก นี่หมายความว่าคุณสามารถแบ่งโค้ดของคุณเป็นหลายไฟล์และจัดหมวดหมู่อย่างมีประสิทธิภาพมากขึ้น
โมดูลต้องถูก import ด้วยวิธีที่เฉพาะเจาะจง มิฉะนั้น Python จะคืนค่าข้อผิดพลาด:
TypeError: 'module' object is not callable
สิ่งนี้เกิดขึ้นเมื่อคุณพยายาม import โมดูลเป็นฟังก์ชัน
สถานการณ์ตัวอย่าง
กำหนดโมดูลชื่อ "cakes" โมดูลนี้มีฟังก์ชันหนึ่ง: read_file ฟังก์ชัน read_file จะอ่านเนื้อหาของไฟล์ข้อความ
ชื่อไฟล์ของเรากำหนดชื่อโมดูลของเรา เพราะเราต้องการให้โมดูลของเราชื่อ "cakes" เราเขียนโค้ดในไฟล์ชื่อ cakes.py:
81% of participants stated they felt more confident about their tech job prospects after attending a bootcamp. Get matched to a bootcamp today.
The average bootcamp grad spent less than six months in career transition, from starting a bootcamp to finding their first job.
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"
เมธอด replace() ใช้แทนที่ตัวอักษรบรรทัดใหม่ ("\n") ด้วยค่าว่าง นี่ลบบรรทัดใหม่ทั้งหมด เราคืนค่า "all_cakes" ที่สิ้นสุดฟังก์ชัน
ตอนนี้ เปิดไฟล์ชื่อ app.py และวางโค้ดนี้:
import cakes cake_list = cakes() print(cake_list)
โค้ดนี้ใช้โมดูล "cakes" ของเราเพื่ออ่านเนื้อหาของไฟล์ "cakes.txt" มันพิมพ์เค้กทั้งหมดที่ฟังก์ชันพบในไฟล์
มารันโค้ดของเรา:
Traceback (most recent call last): File "main.py", line 3, in <module> cakes = cakes() TypeError: 'module' object is not callable
โค้ดของเราคืนค่าข้อผิดพลาด
วิธีแก้ไข
มา看看คำสั่ง import ในไฟล์ app.py ของเรา:
import cakes
เรา import โมดูล "cakes" นี่ประกอบด้วยตัวแปร คลาส และฟังก์ชันทั้งหมดที่เราประกาศในไฟล์ "cakes.py"
ตอนนี้ มา看看บรรทัดโค้ดถัดไปของเรา:
cake_list = cakes()
แม้โมดูล "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 execute ฟังก์ชันนั้น
เรากำหนดผลลัพธ์ของฟังก์ชัน read_file() ให้กับตัวแปรชื่อ "cake_list" จากนั้น เราพิมพ์รายการนั้นไปยังคอนโซล
ทางเลือกอื่น import ฟังก์ชัน read_file เข้าไปในโปรแกรมของเราโดยตรง:
from cakes import read_file cake_list = read_file() print(cake_list)
โค้ดของเราคืนค่า:
['Cinnamon Babka', 'Chocolate Cupcake']
โค้ดของเรา execute ฟังก์ชัน read_file() จากโมดูล "cakes" ในตัวอย่างนี้ เรา import โมดูล "cakes" ทั้งหมด แทนที่จะทำเช่นนั้น เรา import ฟังก์ชันหนึ่งจากโมดูล "cakes": read_file
สังเกตว่าเมื่อเรา import read_file เราไม่ต้องใช้ cakes.read_file() เพื่อเรียกฟังก์ชันของเราอีกต่อไป เราใช้ read_file() เพราะเรา import ฟังก์ชัน read_file() เข้าไปในโค้ดของเราโดยตรง
สรุป
โค้ดสำหรับโมดูล Python มีอยู่ในไฟล์ที่ต่างกัน มีหลายวิธีในการ import ฟังก์ชันและค่าจากโมดูล และง่ายที่จะทำผิด
เมื่อคุณทำงานกับโมดูล ตรวจสอบให้แน่ใจว่าคุณอ้างอิงฟังก์ชัน คลาส และตัวแปรที่คุณต้องการเข้าถึงอย่างถูกต้อง คุณต้องระบุฟังก์ชันที่แน่นอนที่คุณต้องการเรียกจากโมดูล หากคุณต้องการอ้างอิงฟังก์ชัน แทนที่จะเรียกโมดูลเอง
ตอนนี้คุณพร้อมที่จะแก้ไข Python TypeError นี้อย่างนักพัฒนามืออาชีพแล้ว!