Khi trình thông dịch Python đọc một tệp Python, trước tiên, nó sẽ đặt một số biến đặc biệt. Sau đó, nó thực thi mã từ tệp.
Một trong những biến đó được gọi là __name__
.
Nếu bạn làm theo từng bước bài viết này và đọc các đoạn mã của nó, bạn sẽ học cách sử dụng if __name__ == "__main__"
và tại sao nó rất quan trọng.
Giải thích các mô-đun Python
Các tệp Python được gọi là các mô-đun và chúng được xác định bởi .py
phần mở rộng tập tin. Một mô-đun có thể định nghĩa các hàm, lớp và biến.
Vì vậy, khi trình thông dịch chạy một mô-đun, __name__
biến sẽ được đặt thành __main__
nếu mô-đun đang được chạy là chương trình chính.
Nhưng nếu mã đang nhập mô-đun từ một mô-đun khác, thì __name__
biến sẽ được đặt thành tên của mô-đun đó.
Hãy xem một ví dụ. Tạo một mô-đun Python có tên file_one.py
và dán mã cấp cao nhất này vào bên trong:
# Python file one module
print("File one __name__ is set to: {}" .format(__name__))
Bằng cách chạy tệp này, bạn sẽ thấy chính xác những gì chúng ta đang nói đến. biến __name__
cho mô-đun này được đặt thành __main__
:
File one __name__ is set to: __main__
Bây giờ thêm một tệp khác có tên file_two.py
và dán mã này vào bên trong:
# Python module to import
print("File two __name__ is set to: {}" .format(__name__))
Ngoài ra, sửa đổi mã trong file_one.py
như thế này vì vậy chúng tôi nhập khẩu file_two
mô-đun:
# Python module to execute
import file_two
print("File one __name__ is set to: {}" .format(__name__))
chạy của chúng tôi file_one
mã một lần nữa sẽ cho thấy rằng __name__
biến trong file_one
không thay đổi và vẫn được đặt thành __main__
. Nhưng bây giờ biến __name__
Trong file_two
được đặt làm tên mô-đun của nó, do đó file_two
.
Kết quả sẽ giống như thế này:
File two __name__ is set to: file_two
File one __name__ is set to: __main__
Nhưng chạy file_two
trực tiếp và bạn sẽ thấy rằng tên của nó được đặt thành __main__
:
File two __name__ is set to: __main__
biến __name__
đối với tệp/mô-đun đang chạy sẽ luôn __main__
. Nhưng __name__
biến cho tất cả các mô-đun khác đang được nhập sẽ được đặt thành tên mô-đun của chúng.
Quy ước đặt tên tệp Python
Cách sử dụng thông thường __name__
và __main__
trông như thế này:
if __name__ == "__main__":
Do something here
Hãy xem cách điều này hoạt động trong cuộc sống thực và cách thực sự sử dụng các biến này.
Biến đổi file_one
và file_two
để trông như thế này:
file_one
:
# Python module to execute
import file_two
print("File one __name__ is set to: {}" .format(__name__))
if __name__ == "__main__":
print("File one executed when ran directly")
else:
print("File one executed when imported")
file_two
:
# Python module to import
print("File two __name__ is set to: {}" .format(__name__))
if __name__ == "__main__":
print("File two executed when ran directly")
else:
print("File two executed when imported")
Một lần nữa, khi chạy file_one
bạn sẽ thấy rằng chương trình đã nhận ra mô-đun nào trong số hai mô-đun này __main__
và thực thi mã theo đầu tiên của chúng tôi if else
các câu lệnh.
Kết quả sẽ giống như thế này:
File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Bây giờ chạy file_two
và bạn sẽ thấy rằng __name__
biến được đặt thành __main__
:
File two __name__ is set to: __main__
File two executed when ran directly
Khi các mô-đun như thế này được nhập và chạy, các chức năng của chúng sẽ được nhập và mã cấp cao nhất sẽ được thực thi.
Để xem quy trình này đang hoạt động, hãy sửa đổi các tệp của bạn thành như sau:
file_one
:
# Python module to execute
import file_two
print("File one __name__ is set to: {}" .format(__name__))
def function_one():
print("Function one is executed")
def function_two():
print("Function two is executed")
if __name__ == "__main__":
print("File one executed when ran directly")
else:
print("File one executed when imported")
file_two
:
# Python module to import
print("File two __name__ is set to: {}" .format(__name__))
def function_three():
print("Function three is executed")
if __name__ == "__main__":
print("File two executed when ran directly")
else:
print("File two executed when imported")
Bây giờ các chức năng được tải nhưng không chạy.
Để chạy một trong các chức năng này, hãy sửa đổi if __name__ == "__main__"
một phần của file_one
để trông như thế này:
if __name__ == "__main__":
print("File one executed when ran directly")
function_two()
else:
print("File one executed when imported")
Khi chạy file_one
bạn sẽ thấy nên như thế này:
File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Ngoài ra, bạn có thể chạy các chức năng từ các tệp đã nhập. Để làm điều đó, hãy sửa đổi if __name__ == “__main__”
một phần của file_one
để trông như thế này:
if __name__ == "__main__":
print("File one executed when ran directly")
function_two()
file_two.function_three()
else:
print("File one executed when imported")
Và bạn có thể mong đợi một kết quả như thế này:
File two __name__ is set to: file_two
File two executed when imported
File one __name__ is set to: __main__
File one executed when ran directly
Function two is executed
Function three is executed
Bây giờ hãy nói file_two
mô-đun thực sự lớn với nhiều chức năng (hai trong trường hợp của chúng tôi) và bạn không muốn nhập tất cả chúng. Biến đổi file_two
để trông như thế này:
# Python module to import
print("File two __name__ is set to: {}" .format(__name__))
def function_three():
print("Function three is executed")
def function_four():
print("Function four is executed")
if __name__ == "__main__":
print("File two executed when ran directly")
else:
print("File two executed when imported")
Và để nhập các chức năng cụ thể từ mô-đun, hãy sử dụng from
khối nhập khẩu trong file_one
tập tin:
# Python module to execute
from file_two import function_three
print("File one __name__ is set to: {}" .format(__name__))
def function_one():
print("Function one is executed")
def function_two():
print("Function two is executed")
if __name__ == "__main__":
print("File one executed when ran directly")
function_two()
function_three()
else:
print("File one executed when imported")
Phần kết luận
Có một trường hợp sử dụng thực sự tốt đẹp cho __name__
biến, cho dù bạn muốn một tệp có thể được chạy dưới dạng chương trình chính hay được nhập bởi các mô-đun khác. Chúng ta có thể sử dụng một if __name__ == "__main__"
khối để cho phép hoặc ngăn các phần mã chạy khi các mô-đun được nhập.
Khi trình thông dịch Python đọc một tệp, __name__
biến được đặt là __main__
nếu mô-đun đang được chạy hoặc dưới dạng tên của mô-đun nếu nó được nhập. Việc đọc tệp sẽ thực thi tất cả mã cấp cao nhất, nhưng không phải các hàm và lớp (vì chúng sẽ chỉ được nhập).
áo ngực! (Điều đó có nghĩa là “Làm tốt lắm” trong tiếng Thụy Điển!)
Xem thêm các bài viết như thế này trên hồ sơ freeCodeCamp, hồ sơ Trung bình của tôi và những nội dung thú vị khác mà tôi xây dựng trên trang GitHub của mình.