2009-10-14 18 views
5

Các PEP 8 khuyến nghị các mô-đun được nhập vào đầu chương trình.Python: nhập khẩu vào đầu chương trình chính & PEP 8

Bây giờ, tôi cảm thấy rằng việc nhập một số chương trình vào đầu chương trình chính (tức là sau if __name__ == '__main__') có ý nghĩa. Ví dụ: nếu chương trình chính đọc đối số từ dòng lệnh, tôi có xu hướng làm import sys ở đầu chương trình chính: theo cách này, sys không cần phải nhập khi mã được sử dụng làm mô-đun, vì ở đó không cần, trong trường hợp này, để truy cập đối số dòng lệnh.

Vi phạm này đối với PEP 8 có hại đến mức nào? Tôi có nên kiềm chế không? hoặc sửa đổi PEP 8 có hợp lý không?

+0

optparse có sẵn để phân tích cú pháp dòng lệnh, tốt hơn sử dụng sys.argv và thực hiện phân tích cú pháp của riêng bạn. – monkut

+1

Related: http://stackoverflow.com/questions/1024049/is-it-pythonic-to-import-inside-functions – codeape

+0

@monkut: optparse không đặc biệt hữu ích nếu bạn không sử dụng dòng lệnh * options * (tức là , khi bạn chỉ cần xử lý các đối số dòng lệnh không có tùy chọn). – EOL

Trả lời

8

Tôi thực sự không thể cho bạn biết mức độ tồi tệ của việc này.

Tuy nhiên, tôi đã cải thiện đáng kể hiệu suất (thời gian phản hồi, tải) cho ứng dụng web bằng cách chỉ nhập một số thư viện nhất định khi sử dụng lần đầu.

BTW, sau đây cũng là từ PEP 8:

Nhưng quan trọng nhất: bí quyết khi được không phù hợp - đôi khi hướng dẫn phong cách chỉ không áp dụng. Khi trong số nghi ngờ, hãy sử dụng phán quyết tốt nhất của bạn. Hãy xem ở các ví dụ khác và quyết định xem trông nào là tốt nhất. Và đừng ngần ngại yêu cầu!

+2

Nếu bạn thực sự lo ngại về điều đó, bạn có thể muốn xem xét yêu cầu: http://hg.intevation.org/mercurial/crew/file/tip/mercurial/demandimport.py – tonfa

+1

Tôi không thấy cách nó sẽ giúp thời gian đáp ứng. Thời gian khởi động chắc chắn –

+0

@tonfa, wow cảm ơn rất nhiều, tôi không biết về điều đó – Prody

2

Tôi khuyên bạn nên làm những gì bạn cảm thấy phù hợp nhất khi không có gì trong PEP về mối quan tâm của bạn.

2

Nhập sys không thực sự mất nhiều thời gian mà tôi sẽ lo lắng về nó. Tuy nhiên, một số mô-đun mất nhiều thời gian hơn. Tôi không nghĩ rằng sys thực sự làm tắc nghẽn không gian tên rất nhiều. Tôi sẽ không sử dụng một biến hoặc lớp được gọi là sys bất kể.

Nếu bạn cho rằng nó gây hại nhiều hơn là tốt để có nó ở trên cùng, bằng mọi cách, hãy làm điều đó theo cách bạn muốn. PEP 8 chỉ là một dòng hướng dẫn và rất nhiều mã bạn thấy không phù hợp với nó.

6

Nói chung, tôi không nghĩ có nhiều tác hại trong việc nhập khẩu muộn cho các mô-đun có thể không cần thiết.

Tuy nhiên sys Tôi chắc chắn sẽ nhập sớm, ở trên cùng. Đó là một mô-đun phổ biến mà rất có khả năng bạn có thể sử dụng sys ở nơi khác trong tập lệnh của bạn và không nhận thấy rằng nó không phải lúc nào cũng được nhập. sys cũng là một trong các mô-đun luôn được tải bởi chính Python, vì vậy bạn không lưu bất kỳ thời gian khởi động mô-đun nào bằng cách tránh nhập (không phải lúc nào cũng có nhiều khởi động cho sys).

2

Sự cố không phải là hiệu suất.

Vấn đề là rõ ràng.

Chương trình "chính" của bạn chỉ là một chương trình chính hiện nay. Ngày mai, nó có thể là một thư viện được bao gồm trong một số chương trình chính cấp cao hơn. Sau đó, nó sẽ chỉ là một mô-đun trong một gói lớn hơn.

Vì cuộc sống của chương trình "chính" của bạn có thể thay đổi, bạn có hai câu trả lời.

  1. Cô lập những thứ "chính" bên trong if __name__ == "__main__". Đây không phải là một sự vi phạm kỳ cục của PEP-8. Đây là một cách hợp lý để đóng gói mọi thứ.

  2. Cố gắng giới hạn số lượng đối tượng địa lý trong tập lệnh chương trình "chính" của bạn. Hãy cố gắng giữ chúng xuống đến import s và các công cụ if __name__ == "__main__". Nếu tập lệnh chính của bạn nhỏ, thì câu hỏi nhập của bạn sẽ biến mất.