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

แก้ไข Python TypeError: 'module' object is not callable

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