2008-11-13 40 views
14

Tôi có nên bắt đầu một chương trình Python với:chương trình Python bắt đầu

if__name__ == '__main__': 
some code... 

Và nếu như vậy, tại sao? Tôi đã nhìn thấy nó nhiều lần nhưng không có một đầu mối về nó.

+0

@Kirill Titov: Vui lòng không chỉnh sửa câu hỏi để nói "Đã đóng". Nó không được đóng lại. Bạn đã chọn câu trả lời - đó là câu trả lời hoàn hảo và tất cả những gì bạn cần làm. Làm nhiều việc hơn là khó hiểu. –

Trả lời

23

Nếu chương trình của bạn có thể sử dụng làm thư viện nhưng bạn cũng có chương trình chính (ví dụ: để kiểm tra thư viện), cấu trúc đó cho phép người khác nhập tệp dưới dạng thư viện và không chạy chương trình chính của bạn. Nếu chương trình của bạn có tên foo.py và bạn "nhập foo" từ tệp python khác, __name__ sẽ đánh giá là 'foo', nhưng nếu bạn chạy "python foo.py" từ dòng lệnh, __name__ sẽ đánh giá là '__main__'.

Lưu ý rằng bạn cần phải chèn một khoảng trống giữa if và _, và thụt chương trình chính:

if __name__ == '__main__': 
    main program here 
+0

+1: Tái sử dụng là quan trọng. Một mô-đun có thể có 2 cuộc sống. Là chương trình chính. Là thành phần trong một số chương trình chính khác. Vì chương trình chính là DOES. Là thành phần, nó chỉ định nghĩa mọi thứ. –

+0

Điều này có thể đi mà không nói, nhưng hãy chắc chắn rằng điều kiện này đi vào cuối tập tin của bạn. –

3

Đây là thực hành tốt. Đầu tiên, nó đánh dấu rõ ràng điểm vào mô-đun của bạn (giả sử bạn không có bất kỳ mã thực thi nào khác tại toplevel - yuck). Thứ hai, nó làm cho mô-đun của bạn có thể nhập được bởi các mô-đun khác mà không thực thi, mà một số công cụ như trình kiểm tra mã, đóng gói, v.v. cần phải làm.

22

Một mô hình tốt hơn là thế này:

def main(): 
    ... 

if __name__ == '__main__': 
    main() 

này cho phép mã của bạn được gọi bởi một người nhập khẩu đó, đồng thời cũng làm cho các chương trình như pycheckerpylint làm việc.

+0

cảm ơn bạn! tôi đã lo lắng rằng toàn bộ chương trình đã được thụt vào từ việc đi. Tôi không thích điều đó. –

18

Guido Van Rossum suggests:

def main(argv=None): 
    if argv is None: 
    argv = sys.argv 
    ... 

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

Bằng cách này bạn có thể chạy main() từ một nơi khác (cung cấp các đối số), và nếu bạn muốn thoát ra với một mã lỗi chỉ return 1 từ main(), và nó đã giành' t làm cho một thông dịch viên tương tác thoát ra do nhầm lẫn.

+0

Có lẽ đảm bảo ví dụ có giá trị trả lại như được nêu trong văn bản? –

+0

Tất cả các hàm đều có giá trị trả về tiềm ẩn là None, có nghĩa là mã thoát là 0. –

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