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

__name__ (ตัวแปรพิเศษ) ใน Python


ไม่เหมือนภาษาโปรแกรมอื่นๆ Python ไม่ได้ออกแบบมาเพื่อเริ่มรันโค้ดจากฟังก์ชัน main อย่างชัดเจน ตัวแปรพิเศษชื่อ __name__ ให้ฟังก์ชันคล้าย main function เนื่องจากเป็นตัวแปรในตัวของภาษา Python เราสามารถเขียนโปรแกรมเพื่อดูค่าของตัวแปรนี้ได้ดังนี้

print(type(__name__))
print(__name__)

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

<class 'str'>
__main__

เห็นได้ว่าค่าของตัวแปร __name__ เป็นชนิดข้อมูล string และเท่ากับ __main__

ด้านล่างคือสองคุณสมบัติหลักของตัวแปร __name__

1. เมื่อคุณรันสคริปต์ Python แบบ standalone ที่เขียนดีและไม่อ้างอิงสคริปต์อื่น ค่าของตัวแปร __name__ จะเท่ากับ __main__

มาเขียนโปรแกรมชื่อ standalone.py เพื่อแสดงคุณสมบัตินี้

def func1():
    print('The value of __name__ is ' + __name__)

if __name__ == '__main__':
    func1()

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

The value of __name__ is __main__

ตามที่คาดไว้ ตัวแปร __name__ ประเมินค่าเป็น __main__ จึงมีเอาต์พุทดังกล่าว

2. คุณสมบัติที่สองเกี่ยวกับการ import สคริปต์ Python หนึ่งเข้าไปในอีกสคริปต์หนึ่ง ในสถานการณ์เช่นนี้ มี scope สอง scope ที่ต่างกันซึ่งอาจถูกพิจารณาว่าเป็น main() function scope แรกคือตัวแปร __main__ ของโปรแกรมที่กำลังรันอยู่ และ scope ที่สองคือตัวแปร __main__ ของสคริปต์ที่ import มาใช้ในโปรแกรมปัจจุบัน

แล้วตัวแปร __main__ ไหนจะถูกใช้?

เมื่อคุณรันฟังก์ชันจากสคริปต์ที่ import มา ตัวแปร __name__ จะประเมินค่าเป็นชื่อจริงของสคริปต์ ไม่เท่ากับ __main__

แต่เมื่อคุณหาค่าของตัวแปร name จากโปรแกรมปัจจุบัน โดยไม่อ้างอิงสคริปต์ที่ import มา มันจะประเมินค่าเป็น __main__ ตามที่คาดไว้ เนื่องจากเป็น scope ของโปรแกรมที่ระดับ indentation 0

โปรแกรมด้านล่างแสดงตัวอย่างนี้

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

import standalone as sa
print('Running the imported script')
sa.func1()
print('\n')
print('Running the current script')
print('The value of __name__ is ' + __name__)

ผลลัพธ์

การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -

Running the imported script
The value of __name__ is standalone
Running the current script
The value of __name__ is __main__

ประโยชน์ของแนวทางนี้คือเมื่อโค้ด if __name__ == "__main__": ถูกใช้ Python interpreter จะตรวจสอบว่ากำลัง parse สคริปต์ที่รันอยู่หรือกำลัง parse สคริปต์ภายนอกชั่วคราว วิธีนี้ให้โปรแกรมเมอร์สามารถควบคุมพฤติกรรมของส่วนต่างๆ ของโปรแกรมได้ โดยเลือกว่าจะรันบรรทัดโค้ดจากสคริปต์ภายนอกและสคริปต์ที่รันอยู่ในสถานการณ์ไหน