2010-10-28 50 views
400

thể trùng lặp:
What does if __name__== "__main__" do?Tại sao sử dụng def main()?

Tôi đã nhìn thấy một số mẫu mã và hướng dẫn sử dụng

def main(): 
    # my code here 

if __name__ == "__main__": 
    main() 

Nhưng tại sao? Có lý do nào không xác định các chức năng của bạn ở phía trên của tập tin, sau đó chỉ cần viết mã dưới nó? tức là

def my_function() 
    # my code here 

def my_function_two() 
    # my code here 

# some code 
# call function 
# print(something) 

Tôi tự hỏi liệu có bất kỳ vần điệu nào cho chính không?

+2

Xem http://stackoverflow.com/questions/419163/what-does-if-name-main-do – gimel

+8

stackoverflow.com/questions/419163/what-does-if-name-main-do does không trả lời toàn bộ câu hỏi. – Johnsyweb

+4

Điều gì mà bản sao không trả lời: có hàm main() (thay vì chỉ viết tất cả mã vào khối "if __name__") vì nó tránh vô tình tạo các biến toàn cục có thể ảnh hưởng đến các hàm khác. – slowdog

Trả lời

465

Nếu không có thư gửi chính, mã sẽ được thực thi ngay cả khi tập lệnh được nhập dưới dạng mô-đun.

+121

Cũng đáng chú ý là có một Hàm 'main()' làm cho nó có thể chạy mã đó bằng: 'module nhập khẩu; module.main() '. Nếu mã chỉ nằm trong khối 'if', nó không thể chạy từ nơi khác. – FogleBird

7

Hãy xem tập lệnh thứ hai. Nếu bạn nhập nó vào một cái khác, hướng dẫn, như ở "mức toàn cầu", sẽ được thực hiện.

72

nếu nội dung của foo.py

print __name__ 
if __name__ == '__main__': 
    print 'XXXX' 

Một tập tin foo.py thể được sử dụng theo hai cách.

  • nhập khẩu trong tập tin khác: import foo

Trong trường hợp này __name__foo, phần mã không được thực thi và không in XXXX.

  • thực hiện trực tiếp: python foo.py

Khi nó được thực hiện trực tiếp, __name__ là giống như __main__ và mã trong phần đó được thực hiện và in XXXX

Một trong những sử dụng của chức năng này để viết các loại kiểm tra đơn vị khác nhau trong cùng một mô-đun.

+0

Mặc dù câu trả lời này ít được bình chọn hơn một số người khác, nhưng giải thích điều này rất rõ ràng. Tôi đọc [câu trả lời này] (http://stackoverflow.com/a/419185/2455888) trước nhưng bạn đã giải thích rõ. +1 – haccks

15

"What does if __name__==“__main__”: do?" đã được trả lời.

Có chức năng main() cho phép bạn gọi chức năng của nó nếu bạn import mô-đun. Lợi ích chính (không có ý định chơi chữ) của điều này (IMHO) là bạn có thể kiểm tra nó.

+1

2 câu hỏi có cùng câu trả lời không làm cho chúng trùng lặp – bubakazouba

+3

@bubakazouba: Tôi đồng ý. Tôi không đánh dấu câu hỏi này là trùng lặp. * Một phần * của câu hỏi này có một câu trả lời thực sự tốt, tôi thấy không có điểm trong nhân đôi câu trả lời. Tôi trả lời * phần còn lại * của câu hỏi. – Johnsyweb

183

Mọi người khác đã trả lời, nhưng tôi nghĩ tôi vẫn còn một thứ khác để thêm.

lý do để có mà if tuyên bố kêu gọi main() (không theo thứ tự đặc biệt):

  • ngôn ngữ khác (như C và Java) có chức năng main() đó được gọi là khi chương trình được thực thi. Sử dụng if này, chúng tôi có thể làm cho Python hoạt động giống như họ, điều này cảm thấy quen thuộc hơn với nhiều người.

  • Mã sẽ là sạch, dễ đọc hơn và được sắp xếp tốt hơn. (vâng, tôi biết điều này là chủ quan)

  • Có thể import mã python đó làm mô-đun mà không có các tác dụng phụ khó chịu.

    • Điều này có nghĩa là bạn có thể chạy thử nghiệm dựa vào mã đó.

    • Điều này có nghĩa là chúng tôi có thể nhập mã đó vào một trình bao python tương tác và kiểm tra/gỡ lỗi/chạy nó.

  • biến bên trong def mainđịa phương, trong khi những người bên ngoài nó là toàn cầu. Điều này có thể giới thiệu một số lỗi và hành vi không mong muốn.

Tuy nhiên, bạn đang không cần để viết một hàm main() và gọi nó bên trong một tuyên bố if.

Bản thân tôi thường bắt đầu viết các kịch bản lệnh ném nhỏ mà không có bất kỳ loại chức năng nào. Nếu kịch bản phát triển đủ lớn, hoặc nếu tôi cảm thấy đặt tất cả các mã bên trong một hàm sẽ mang lại lợi ích cho tôi, sau đó tôi refactor mã và làm điều đó. Điều này cũng xảy ra khi tôi viết bash tập lệnh.

Ngay cả khi bạn đặt mã bên trong hàm chính, bạn không bắt buộc phải viết mã chính xác như vậy. Một biến thể gọn gàng có thể là:

import sys 

def main(argv): 
    # My code here 
    pass 

if __name__ == "__main__": 
    main(sys.argv) 

Điều này có nghĩa là bạn có thể gọi main() từ các tập lệnh khác (hoặc trình tương tác) chuyển các thông số tùy chỉnh. Điều này có thể hữu ích trong các bài kiểm tra đơn vị, hoặc khi xử lý theo lô. Nhưng hãy nhớ rằng đoạn mã trên sẽ yêu cầu phân tích cú pháp của argv, do đó có thể tốt hơn nếu sử dụng một lệnh gọi khác để chuyển các tham số đã được phân tích cú pháp.

Trong một ứng dụng hướng đối tượng tôi đã viết, mã trông như thế này:

class MyApplication(something): 
    # My code here 

if __name__ == "__main__": 
    app = MyApplication() 
    app.run() 

Vì vậy, cảm thấy tự do để viết mã mà phù hợp với bạn tốt hơn. :)

+0

Một lợi ích của việc gọi 'main' với' sys.argv' như một tham số như thể hiện ở đây là cách tiếp cận này hoạt động tốt với mô-đun 'argparse' (trong đó, IMO, là * Right Way * để xử lý đối số dòng lệnh) . Tất cả những gì bạn cần làm là chuyển 'argv' sang' parse_args' trong 'main'. – jkt123

Các vấn đề liên quan