If name main in python

- 4 mins

Cái nhìn thoáng qua

Mô tả một cách đơn giản thì khi có một file chứa đoạn lệnh này if __name__ == "__main__"::

Ví dụ ta có một folder test gồm 2 file add_number.pymain.py:

Nội dung file như sau:

# add.py
def add(a, b):
    print(f"{a} + {b} = {a + b}")


if __name__ == "__main__":
    print(3, 4)
# main.py
from test import add_number

if __name__ == "__main__":
    add_number.add(1, 2)

Nếu bạn chạy file add.py kết quả nhận được sẽ là 3 + 4 = 7. Tuy nhiên nếu bạn chạy file main.py thì kết quả in ra màn hình sẽ là 1 + 2 = 3 và đoạn lệnh print(3, 4) đặt bên trong khối if __name__ == "__main__": của hàm add.py sẽ không được thực hiện. Do ta import file add_number.py vào file main.py để sử dụng hàm add(a, b) nên đoạn lệnh print(3, 4) không được thực hiện.

Mục đích của việc này cho phép bạn có thể chạy các đoạn code không liên quan đến các hàm bạn đã viết mà không bị ảnh hưởng khi import các hàm này để sử dụng trong các file khác.

Tìm hiểu kĩ hơn chút

if là lệnh đều kiện, vì vậy đoạn lệnh if __name__ == "__main__": sẽ kiểm tra:

Vậy khi nào __name__ bằng __main__?

Ta sửa file main.py và file add.py như sau:

# add.py
def add(a, b):
    print(f"__name__ in add_two_number file is {__name__}")
    print(f"{a} + {b} = {a + b}")


if __name__ == "__main__":
    print(3, 4)
# main.py
from test import add_number

if __name__ == "__main__":
    print(f"__name__ in main file is {__name__}")
    add_number.add(1, 2)

Chạy thử lại file main.py kết quả nhận được sẽ là:

__name__ in main file is __main__
__name__ in add_two_number file is test.add_two_number
1 + 2 = 3

Trong python, top-code level là khái niệm chỉ môi trường của module đầu tiên được chạy để khởi động chương trình và import các module cần thiết vào để sử dụng. Ở ví dụ trên, main.py được chạy đầu tiên nên nó được hiểu là top-code level của chương trình. Biến __name__ trong python gọi là biến global, mỗi file code .py đều có một biến __name__.

Trong môi trường top-code level, biến __name__ được đặt giá trị bằng ""__main__"" và có kiểu str. Nếu bạn không set câu lệnh if __name__ == "__main__":, thì biến __name__ cũng được mặc định set giá trị bằng ""__main__"". Còn ở trong các module được import vào file main.py để sử dụng như add_number.py thì biến __name__ được đặt giá trị là tên của module.

Ý tương về __name__ == "__main__" trong python cũng tương tự như trong nhiều ngôn ngữ khác như Java, C,… tuy nhiên không chặt chẽ như các ngôn ngữ này. Câu lệnh if __name__ == "__main__": có thể hữu ích khi chạy python sử dụng dòng lệnh (ngoài ra python còn cung cấp các cách chạy khác mình sẽ đề cập đến sau này) hoặc muốn test một vài chức năng trong module của bạn trước khi import nó để sử dụng trong các module khác (tránh side-effects - các tác dụng phụ có thể xảy ra). Tuy nhiên khi chạy những chương trình đơn giản trên 1 file duy nhất như dùng notebooks để visualize dữ liệu thì bạn có thể không cần quá quan tâm đến điều này.

comments powered by Disqus
rss facebook twitter github gitlab youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora