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

สภาพแวดล้อมสคริปต์ระดับบนสุดใน Python (__main__)


โมดูลอ็อบเจ็กต์มีลักษณะเฉพาะด้วยคุณลักษณะต่างๆ ชื่อแอตทริบิวต์นำหน้าและหลังแก้ไขด้วยเครื่องหมายขีดล่างคู่ __ คุณลักษณะที่สำคัญที่สุดของโมดูลคือ __name__ เมื่อ Python ทำงานเป็นโค้ดสั่งการระดับบนสุด เช่น เมื่ออ่านจากอินพุตมาตรฐาน สคริปต์ หรือจากข้อความโต้ตอบแบบโต้ตอบ แอตทริบิวต์ __name__ จะถูกตั้งค่าเป็น '__main__ '.

>>> __name__
'__main__'

จากภายในสคริปต์ด้วย เราพบว่าค่าของแอตทริบิวต์ __name__ ถูกตั้งค่าเป็น '__main__' รันสคริปต์ต่อไปนี้

'module docstring'
print ('name of module:',__name__)

ผลผลิต

name of module: __main__

อย่างไรก็ตาม สำหรับโมดูลที่นำเข้า คุณลักษณะนี้ถูกกำหนดเป็นชื่อของสคริปต์ Python สำหรับโมดูล hello.py

>>> import hello
>>> hello.__name__
hello

ตามที่เห็นก่อนหน้านี้ ค่าของ __name__ ถูกตั้งค่าเป็น __main__ สำหรับโมดูลระดับบนสุด อย่างไรก็ตาม สำหรับโมดูลที่นำเข้า จะถูกตั้งค่าเป็นชื่อของไฟล์ เรียกใช้สคริปต์ต่อไปนี้ (moduletest.py)

import hello
print ('name of top level module:', __name__)
print ('name of imported module:', hello.__name__)

ผลผลิต

name of top level module: __main__
name of imported module: hello

สคริปต์ Python ที่มีฟังก์ชันอาจมีโค้ดสั่งการบางอย่าง ดังนั้นหากเรานำเข้ารหัสนั้นจะถูกเรียกใช้โดยอัตโนมัติ เรามีสคริปต์นี้ message.py ที่มีสองฟังก์ชัน ในการป้อนข้อมูลของผู้ใช้ส่วนที่ปฏิบัติการได้จัดเตรียมไว้เป็นอาร์กิวเมนต์ของฟังก์ชัน thanks()

def welcome(name):
print ("Hi {}. Welcome to TutorialsPoint".format(name))
return
def thanks(name):
print ("Thank you {}. See you again".format(name))
name = input('enter name:')
thanks(name)

เห็นได้ชัดว่าเมื่อเราเรียกใช้เอาต์พุตของ message.py จะแสดงข้อความขอบคุณดังนี้

enter name:Ajit
Thank you Ajit. See you again

เรามีสคริปต์ moduletest.py ดังนี้

import messages
print ('name of top level module:', __name__)
print ('name of imported module:', messages.__name__)

ตอนนี้ หากเราเรียกใช้สคริปต์ moduletest.py เราจะพบว่าคำสั่งอินพุตและการเรียก to welcome() จะถูกดำเนินการ

c:\python37>python moduletest.py

ผลผลิต

enter name:Kishan
Thank you Kishan. See you again
enter name:milind
Hi milind. Welcome to TutorialsPoint

นี่คือผลลัพธ์ของทั้งสองสคริปต์ แต่ต้องการนำเข้าฟังก์ชันจากโมดูลข้อความ แต่ไม่ใช่โค้ดสั่งการในนั้น

นี่คือความจริงที่ว่าค่าของ __name__attribute ของสคริปต์ระดับบนสุดคือ __main__ มีประโยชน์ เปลี่ยนสคริปต์ message.py เพื่อให้รันคำสั่งอินพุตและฟังก์ชันเรียกใช้เฉพาะเมื่อ __name__ เท่ากับ __main__

"docstring of messages module"
def welcome(name):
print ("Hi {}. Welcome to TutorialsPoint".format(name))
return
def thanks(name):
print ("Thank you {}. See you again".format(name))
if __name__=='__main__':
name = input('enter name')
thanks(name)

ใช้เทคนิคข้างต้นเมื่อใดก็ตามที่คุณต้องการโมดูลที่สามารถดำเนินการได้เช่นเดียวกับการนำเข้า moduletest.py ไม่ต้องการการเปลี่ยนแปลงใดๆ ส่วนปฏิบัติการในโมดูลข้อความจะไม่ทำงานในขณะนี้

enter name: milind
Hi milind. Welcome to TutorialsPoint

โปรดทราบว่าการดำเนินการนี้ไม่ได้ป้องกันคุณจากการเรียกใช้สคริปต์ message.py อย่างอิสระ