Python if __name__ == __main__ Giải thích với các ví dụ về mã

Khi một trình thông dịch Python đọc một tệp Python, trước tiên nó sẽ đặt một vài biến đặc biệt. Sau đó, nó thực thi mã từ tệp.

Một trong những biến đó được gọi __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 cách sử dụng if __name__ == "__main__"và tại sao nó lại quan trọng như vậy.

Giải thích các mô-đun Python

Các tệp Python được gọi là mô-đun và chúng được xác định bằng .pyphần mở rộng tệp. Một mô-đun có thể xác định 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 như   __main__thể 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ô-đ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.pyvà 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. Biến __name__cho mô-đun này được đặt thành __main__:

File one __name__ is set to: __main__

Bây giờ hãy thêm một tệp khác có tên file_two.pyvà 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, hãy sửa đổi mã file_one.pynhư thế này để chúng tôi nhập file_twomô-đun:

# Python module to execute import file_two print("File one __name__ is set to: {}" .format(__name__)) 

Chạy file_onemã của chúng tôi một lần nữa sẽ cho thấy rằng __name__biến trong biến file_onekhô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ẽ như thế này:

File two __name__ is set to: file_two File one __name__ is set to: __main__ 

Nhưng chạy file_twotrực tiếp và bạn sẽ thấy tên của nó được đặt thành __main__:

File two __name__ is set to: __main__ 

Biến __name__cho tệp / mô-đun đang chạy sẽ luôn là __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____main__trông như thế này:

if __name__ == "__main__": Do something here 

Hãy xem điều này hoạt động như thế nào trong cuộc sống thực và cách thực sự sử dụng các biến này.

Sửa đổi file_onefile_twotrô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_onebạn sẽ thấy rằng chương trình đã nhận dạng được mô-đun nào trong hai mô-đun này __main__và thực thi mã theo các if elsecâu lệnh đầu tiên của chúng tôi .

Kết quả sẽ 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ờ hãy chạy file_twovà 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 được thực thi.

Để xem quá trình này hoạt động, hãy sửa đổi tệp của bạn để trông giống 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 những chức năng này, hãy sửa đổi if __name__ == "__main__"một phần của file_oneđể trông giống như sau:

if __name__ == "__main__": print("File one executed when ran directly") function_two() else: print("File one executed when imported") 

Khi chạy, file_onebạn sẽ thấy 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 giống như sau:

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ờ, giả sử file_twomô-đun thực sự lớn với rất nhiều chức năng (trong trường hợp của chúng tôi là hai chức năng) và bạn không muốn nhập tất cả chúng. Sửa đổ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") 

And to import the specific functions from the module, use the from import block in the file_one file:

# 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")

Conclusion

There is a really nice use case for the __name__ variable, whether you want a file that can be run as the main program or imported by other modules. We can use an if __name__ == "__main__" block to allow or prevent parts of code from being run when the modules are imported.

When the Python interpreter reads a file, the __name__ variable is set as __main__ if the module being run, or as the module's name if it is imported. Reading the file executes all top level code, but not functions and classes (since they will only get imported).

Bra gjort! (That means "Well done" in Swedish!)

Xem thêm các bài viết như thế này trên hồ sơ freeCodeCamp, hồ sơ Medium và các nội dung thú vị khác mà tôi xây dựng trên trang GitHub của mình.