Python: if __name__ == ‘__main__’ — คู่มือสำหรับผู้เริ่มต้น

1. บทนำ

โครงสร้าง "if **name** == '**main**'" ที่มักพบในโปรแกรม Python เป็นคุณลักษณะที่สำคัญสำหรับการกำหนดว่าการสคริปต์ถูกเรียกใช้อย่างไร โดยการใช้โครงสร้างนี้ โค้ดเดียวกันสามารถทำงานแตกต่างกันได้ขึ้นอยู่กับว่า “รันโดยตรง” หรือ “นำเข้าจากสคริปต์อื่น” การเข้าใจคุณลักษณะนี้อย่างถูกต้องจะช่วยเพิ่มการนำโค้ดกลับมาใช้ใหม่และการบำรุงรักษาได้ดีขึ้น รวมถึงทำให้การดีบักและการทดสอบมีประสิทธิภาพมากขึ้น ในบทความนี้ เราจะอธิบายรายละเอียดเกี่ยวกับบทบาท การใช้งาน และประโยชน์ของโครงสร้างนี้ พร้อมตัวอย่างโค้ดที่เป็นรูปธรรม

2. ความเข้าใจพื้นฐานเกี่ยวกับ name และ main ของ Python

ตัวแปรพิเศษ name ของ Python คืออะไร?

เมื่อโปรแกรม Python ถูกดำเนินการ ตัวแปรพิเศษหลายตัวจะถูกสร้างโดยอัตโนมัติ __name__ เป็นหนึ่งในนั้นและเก็บชื่อของไฟล์ (โมดูล) ที่กำลังทำงานอยู่ โดยทั่วไป ตัวแปร __name__ จะบ่งบอกว่าโมดูลใดที่โปรแกรมถูกเรียกใช้จาก

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

ตัวอย่าง: พฤติกรรมของ name

สมมติว่ามีไฟล์ example.py ที่มีเนื้อหาดังต่อไปนี้

# example.py
print(__name__)

หากคุณรันไฟล์นี้โดยตรง ค่า __name__ จะกลายเป็น '__main__' และเทอร์มินัลจะแสดงผลดังต่อไปนี้

__main__

ในทางกลับกัน เมื่อไฟล์นี้ถูกนำเข้าจากไฟล์อื่น ค่า __name__ จะถูกตั้งเป็นชื่อไฟล์ 'example' แทน __main__ ซึ่งแสดงว่าค่า __name__ จะเปลี่ยนแปลงตามวิธีการรันสคริปต์

main คืออะไร?

ตัวแปลภาษา Python จะกำหนดชื่อพิเศษ “__main__” ให้กับไฟล์ที่กำลังทำงานอยู่ ซึ่งทำให้โปรแกรม Python สามารถยืนยันว่าสคริปต์กำลังรันโดยตรงโดยตรวจสอบ “__main__

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

3. การใช้งานจริงของ if **name** == ‘**main**‘

การใช้โครงสร้าง "if **name** == ‘**main**‘" ทำให้คุณสามารถรันโค้ดเฉพาะเมื่อสคริปต์ Python ถูกเรียกใช้งานโดยตรง โครงสร้างนี้มีประโยชน์อย่างยิ่งในการควบคุมพฤติกรรมของโค้ดให้เป็นไปตามที่ต้องการ

ไวยากรณ์พื้นฐาน

if __name__ == '__main__':
    # Code that runs only when the script is executed directly
    print("This script is being run directly.")

ตัวอย่างที่เป็นรูปธรรม

ด้านล่างเป็นโค้ดที่ใช้ไฟล์ calculate.py เป็นตัวอย่าง ไฟล์นี้มีฟังก์ชันและคำสั่งเงื่อนไข

# calculate.py
def add(a, b):
    return a + b

if __name__ == '__main__':
    result = add(3, 4)
    print("Calculation result:", result)

ผลลัพธ์การรัน

หากคุณรันไฟล์นี้โดยตรง จะได้ผลลัพธ์ดังต่อไปนี้

Calculation result: 7

ในทางกลับกัน หากโมดูล calculate นี้ถูกนำเข้าจากไฟล์อื่น โค้ดที่อยู่หลัง if __name__ == '__main__' จะไม่ทำงาน ด้านล่างเป็นตัวอย่างการนำเข้าและใช้งานจากไฟล์อื่น main_script.py

# main_script.py
import calculate

# When imported, the code under if __name__ == '__main__' in calculate.py is not executed
print(calculate.add(10, 5))  # 15 is printed

ดังที่แสดง การใช้โครงสร้าง "if **name** == ‘**main**‘" ทำให้สคริปต์ทำงานแตกต่างกันเมื่อรันโดยตรงเทียบกับเมื่อถูกนำเข้าโดยสคริปต์อื่น

4. ประโยชน์ของการใช้โครงสร้างนี้

1. เพิ่มความสามารถในการนำโมดูลกลับมาใช้ใหม่

การใช้ 「if name == ‘main‘」 ช่วยเพิ่มความสามารถในการนำโมดูลกลับมาใช้ใหม่ โดยป้องกันไม่ให้โค้ดที่ไม่จำเป็นทำงานเมื่อโมดูลถูกนำเข้า และทำให้คุณควบคุมให้ส่วนที่จำเป็นเท่านั้นทำงาน ซึ่งช่วยปรับปรุงการบำรุงรักษาโค้ดได้ดีขึ้น

2. การทดสอบที่ง่ายขึ้น

โดยการวางโค้ดทดสอบหรือดีบักไว้ภายใน if __name__ == '__main__' คุณสามารถรันการทดสอบได้อย่างง่ายดายในระหว่างการพัฒนา เนื่องจากโค้ดทดสอบจะไม่ถูกเรียกใช้เมื่อโมดูลถูกนำเข้า ทำให้การดีบักมีประสิทธิภาพมากขึ้น

ตัวอย่างโค้ดทดสอบ

เราจะเพิ่มการทดสอบอย่างง่ายให้กับ calculate.py

# calculate.py
def add(a, b):
    return a + b

if __name__ == '__main__':
    # Test code
    print("3 + 4 =", add(3, 4))
    print("10 + 5 =", add(10, 5))

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

年収訴求

5. ข้อควรระวังและแนวปฏิบัติที่ดีที่สุด

ข้อควรระวัง

  1. ปรับปรุงความชัดเจนของโค้ด if __name__ == '__main__' วางโค้ดการทดสอบและการดำเนินการด้านล่างจุดนี้เพื่อแยกความรับผิดชอบในไฟล์อย่างชัดเจน ตรวจสอบให้ส่วนที่ไม่ควรทำงานเมื่อถูกนำเข้าอยู่ภายในเงื่อนไขเพื่อป้องกันโค้ดที่ไม่จำเป็นทำงานโดยบังเอิญ.
  2. ระมัดระวังการนำเข้าวงจร หากหลายไฟล์นำเข้ากันและกันในโค้ดที่ใช้ if __name__ == '__main__' ให้ระวังไม่ให้เกิดการนำเข้าวงจร การพึ่งพาโมดูลที่ซับซ้อนเพิ่มความเสี่ยงของการนำเข้าวงจร ดังนั้นควรพยายามทำให้การพึ่งพาเป็นแบบง่าย.

แนวปฏิบัติที่ดีที่สุด

  1. ใส่โค้ดการทดสอบในบล็อกหลัก โดยวางโค้ดการทดสอบภายใน if __name__ == '__main__' คุณจะป้องกันการทำงานที่ไม่จำเป็นเมื่อโมดูลถูกนำเข้าโดยโค้ดอื่น การทำให้การทดสอบทำงานเฉพาะเมื่อโมดูลถูกเรียกใช้โดยตรงช่วยหลีกเลี่ยงพฤติกรรมที่ไม่คาดคิด.
  2. จัดกลุ่มฟังก์ชันที่เกี่ยวข้องเข้าด้วยกัน โดยจัดกลุ่มฟังก์ชันที่เกี่ยวข้องภายใน if __name__ == '__main__' และเรียกใช้ตามต้องการ โค้ดของคุณจะกระชับ อ่านง่ายขึ้น และบำรุงรักษาได้ง่ายขึ้น.

6. สรุป

“if name == ‘main‘” เป็นโครงสร้างที่สะดวกในการกำหนดว่าสคริปต์ Python ถูกเรียกใช้อย่างไร การใช้โครงสร้างนี้ทำให้คุณมั่นใจว่าโค้ดจะทำงานเฉพาะเมื่อสคริปต์ถูกเรียกใช้โดยตรง ช่วยเพิ่มการนำโมดูลกลับมาใช้ใหม่และทำให้การทดสอบง่ายขึ้น
เมื่อเขียนโปรแกรมด้วย Python ควรใช้โครงสร้างนี้อย่างมีประสิทธิภาพและแยกสคริปต์และโมดูลอย่างเหมาะสมเพื่อเพิ่มความสามารถในการบำรุงรักษาและการนำกลับมาใช้ใหม่ของโค้ด.

年収訴求