2010-01-01 21 views
6

Tôi đang phát triển một gói Python bằng cách sử dụng trình soạn thảo văn bản và IPython. Mỗi lần tôi thay đổi bất kỳ mã mô-đun nào, tôi phải khởi động lại trình thông dịch để kiểm tra điều này. Đây là một nỗi đau vì các lớp học mà tôi đang phát triển dựa vào bối cảnh cần phải được thiết lập lại trên mỗi lần tải lại.Làm thế nào để phát triển một mô-đun/gói Python mà không phải khởi động lại trình thông dịch sau mỗi lần thay đổi?

Tôi biết chức năng reload(), nhưng điều này có vẻ là frowned upon (cũng vì nó đã bị xuống hạng từ Python 3.0 tích hợp) và hơn thế nữa nó hiếm khi hoạt động vì các mô-đun hầu như luôn có nhiều tham chiếu.

Câu hỏi của tôi là - cách tốt nhất/được chấp nhận để phát triển một mô-đun/gói Python để tôi không phải trải qua nỗi đau khi liên tục thiết lập lại ngữ cảnh thông dịch của mình là gì?

Một ý tưởng tôi đã nghĩ là sử dụng thủ thuật if __name__ == '__main__': để chạy mô-đun trực tiếp để mã không được nhập. Tuy nhiên điều này để lại một loạt các cruft theo ngữ cảnh (cụ thể để thiết lập của tôi) ở dưới cùng của các tập tin mô-đun của tôi.

Ý tưởng?

Trả lời

2

ipython không cho phép load lại thấy chức năng kỳ diệu% chạy iPython doc

hoặc nếu module dưới một sự đã thay đổi đệ quy dreloadd() chức năng

Nếu bạn có một bối cảnh phức tạp là nó có thể tạo ra nó trong mô-đun khác? hoặc gán nó vào một biến toàn cầu mà sẽ ở xung quanh như người phiên dịch không được khởi động lại

+0

Sử dụng% chạy để tải mô-đun froma thật tuyệt vời, cảm ơn! – Brendan

+0

Âm thanh 'dreload()' cũng tốt nhưng có vẻ như đã gặp vấn đề với Numpy - nó cũng có vẻ bỏ qua bất cứ điều gì tôi đặt trong danh sách từ khóa 'exclude' ... – Brendan

+0

Vấn đề với Numpy và' dreload() 'là tài liệu ở đây https://bugs.launchpad.net/ipython/+bug/306805 – Brendan

0

bạn có thể tạo ra một kịch bản python rằng thiết lập ngữ cảnh của bạn và chạy nó với

python -i context-setup.py 


    -i  When a script is passed as first argument or the -c option is 
      used, enter interactive mode after executing the script or the 
      command. It does not read the $PYTHONSTARTUP file. This can be 
      useful to inspect global variables or a stack trace when a 
      script raises an exception. 
3

Một cách tiếp cận khác nhau có thể để chính thức hóa thử nghiệm phát triển theo định hướng của bạn và thay vì sử dụng thông dịch viên để kiểm tra mô-đun của bạn, hãy lưu các thử nghiệm của bạn và chạy chúng trực tiếp.

Bạn có thể biết cách khác nhau để làm điều này với python, tôi tưởng tượng cách đơn giản nhất để bắt đầu theo hướng này là sao chép và dán những gì bạn làm trong trình thông dịch vào docstring dưới dạng doctest và thêm phần sau vào cuối mô-đun của bạn:

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

Kiểm tra không chính thức của bạn sẽ được lặp lại mỗi khi mô-đun được gọi trực tiếp. Điều này có một số lợi ích khác. Xem doctest docs để biết thêm thông tin về cách viết tài liệu.

+0

Lời khuyên để thúc đẩy sự phát triển bằng cách sử dụng các thử nghiệm * tự động * (với các mô-đun py.test hoặc unittest, chẳng hạn) xứng đáng là +10, nhưng tôi có thể cho nó chỉ một. :( –

+0

Đó cũng là một ý kiến ​​hay.Tuy nhiên, API đang thay đổi nhanh chóng tại thời điểm này ở giai đoạn đầu. Đây là thứ mà tôi thường đưa vào sau trong quá trình phát triển gói. – Brendan

1

Làm thế nào để sử dụng nose với nosey để chạy thử nghiệm của bạn tự động trong một thiết bị đầu cuối riêng biệt mỗi khi bạn lưu chỉnh sửa của bạn vào đĩa? Thiết lập tất cả các trạng thái bạn cần trong các bài kiểm tra đơn vị của bạn.

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