2011-11-22 30 views
8

thể trùng lặp:
What does <if name==“main”:> do?`if name ==" __main __ "` có nghĩa là gì trong Python?

Tôi đã viết kịch bản bằng Python cho khá trong một giờ và tôi nghiên cứu hơn về Python như tôi cần nó. Khi đọc mã của người khác, tôi gặp if name == "__main__": xây dựng khá thường xuyên.

Điều gì là tốt cho?

+1

Ồ, tôi hiểu rồi ... 'nếu __name __ = "__ __ chính":' kiểm tra tàn lụi kịch bản là một độc lập hoặc một mô-đun. – Adobe

+1

Đối với người sao chép và/hoặc để tránh nhầm lẫn, hãy lưu ý lỗi đánh máy trong nhận xét trước: 'if __name __ ==" __ main __ ":' – alberto

Trả lời

20

Điều này cho phép bạn sử dụng cùng một tệp với cả thư viện (bằng cách nhập nó) hoặc làm điểm bắt đầu cho một ứng dụng.

Ví dụ, hãy xem xét các hồ sơ sau:

# hello.py 
def hello(to=__name__): 
    return "hello, %s" % to 

if __name__ == "__main__": 
    print hello("world") 

Bạn có thể sử dụng mã mà theo hai cách. Đối với một, bạn có thể viết một chương trình nhập khẩu nó. Nếu bạn nhập thư viện, __name__ sẽ là tên của thư viện và do đó việc kiểm tra sẽ thất bại, và mã sẽ không thực hiện (đó là hành vi mong muốn):

#program.py 
from hello import hello # this won't cause anything to print 
print hello("world") 

Nếu bạn không muốn viết tập tin thứ hai này, bạn có thể trực tiếp chạy mã của bạn từ dòng lệnh với một cái gì đó như:

$ python hello.py 
hello, __main__ 

hành vi này tất cả phụ thuộc vào biến đặc biệt __name__ mà python sẽ đặt dựa vào việc thư viện được nhập khẩu hoặc chạy trực tiếp bởi thông dịch viên. Nếu chạy trực tiếp, nó sẽ được đặt thành __main__. Nếu được nhập, nó sẽ được đặt thành tên thư viện (trong trường hợp này là hello).

Thường thì cấu trúc này được sử dụng để thêm các kiểm tra đơn vị vào mã của bạn. Bằng cách này, khi bạn viết một thư viện, bạn có thể nhúng mã thử nghiệm ngay trong tệp mà không lo lắng rằng nó sẽ được thực hiện khi thư viện được sử dụng theo cách thông thường. Khi bạn muốn kiểm tra thư viện, bạn không cần bất kỳ khung công tác nào vì bạn chỉ có thể chạy thư viện như thể nó là một chương trình.

Xem thêm __main__ in the python documentation (mặc dù nó khá thưa thớt)

3

Về cơ bản,

Có sự phân biệt giữa tệp tập lệnh "chính" và tệp bên ngoài được nhập hoặc tham chiếu theo cách khác. Nếu tập lệnh là tập lệnh "chính" thì biến đặc biệt __name__ sẽ bằng "__main__".

Bạn có thể sử dụng điều này để bảo vệ mã "thực thi" khỏi các lớp và biến mà tập lệnh có. Điều này cho phép bạn nhập tập lệnh và sử dụng các lớp và biến mà không thực sự chạy mã chính của tập lệnh đó nếu có.

+0

Phần thưởng: Bạn tìm thấy gì trong __name__ nếu bạn nhập mô-đun điều đó xảy ra được đặt tên là "__main__"? – Agrajag