Tôi đã mã hóa rất nhiều trong Python về muộn. Và tôi đã làm việc với dữ liệu mà tôi chưa từng làm trước đây, sử dụng các công thức chưa từng thấy trước đây và xử lý các tệp lớn. Tất cả điều này khiến tôi viết rất nhiều bản in để xác minh xem nó có đúng hay không và xác định các điểm thất bại. Nhưng, nói chung, xuất ra rất nhiều thông tin không phải là một thực hành tốt. Làm cách nào để sử dụng các câu lệnh in khi tôi muốn gỡ lỗi và để chúng bị bỏ qua khi tôi không muốn chúng được in?Chỉ sử dụng lệnh in để gỡ lỗi
Trả lời
Mô-đun logging
có mọi thứ bạn có thể muốn. Nó có thể có vẻ quá nhiều lúc đầu, nhưng chỉ sử dụng các bộ phận bạn cần. Tôi khuyên bạn nên sử dụng logging.basicConfig
để chuyển đổi mức ghi nhật ký thành stderr
và simple log methods, debug
, info
, warning
, error
và critical
.
import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))
Sử dụng mô-đun thư viện tích hợp sẵn thay vì in.
Bạn tạo một đối tượng Logger
(nói logger
), và sau đó sau đó, bất cứ khi nào bạn chèn một bản in debug, bạn chỉ cần đặt:
logger.debug("Some string")
Bạn có thể sử dụng logger.setLevel
vào lúc bắt đầu của chương trình để thiết lập trình độ đầu ra. Nếu bạn đặt nó thành DEBUG, nó sẽ in tất cả các lỗi. Đặt nó thành INFO hoặc cao hơn và ngay lập tức tất cả các lỗi sẽ biến mất.
Bạn cũng có thể sử dụng nó để ghi lại những điều nghiêm trọng hơn, ở các cấp độ khác nhau (INFO, CẢNH BÁO và L ERI).
Một cách đơn giản để làm điều này là để gọi một chức năng logging:
DEBUG = True
def log(s):
if DEBUG:
print s
log("hello world")
Sau đó, bạn có thể thay đổi giá trị của DEBUG
và chạy mã của bạn có hoặc không có khai thác gỗ.
Mô-đun chuẩn logging
có cơ chế phức tạp hơn cho việc này.
Tôi không biết gì về người khác, nhưng tôi đã được sử dụng để xác định một "hằng số toàn cầu" (DEBUG
) và sau đó là một chức năng toàn cầu (debug(msg)
) mà sẽ in msg
chỉ khi DEBUG == True
.
Sau đó, tôi viết các câu lệnh debug của tôi như:
debug('My value: %d' % value)
... sau đó tôi nhận kiểm tra đơn vị và không bao giờ làm điều này một lần nữa! :)
Thử nghiệm đơn vị ha. Được rồi, đó là một điều khác để được chọn sau đó: ( – crazyaboutliv
Tôi không muốn khuyến khích kiểm thử đơn vị - đó là điều cần thiết. Nhưng tôi không nghĩ rằng đó là một thay thế cho việc đăng nhập, thậm chí là một kỹ thuật gỡ lỗi. – mgiuca
@crazyaboutliv - Kiểm tra đơn vị được thực hiện đúng cách là rất tốt. Hãy xem [chương này] (http://diveintopython.org/unit_testing/index.html) để lặn vào python cho một sự linh hoạt, ngắn gọn, dễ làm theo bài thuyết trình – mac
Trước hết, tôi sẽ đứng thứ hai đề cử khuôn khổ logging của python. Hãy cẩn thận một chút về cách bạn sử dụng nó, tuy nhiên. Cụ thể: hãy để khung khai thác gỗ mở rộng các biến của bạn, không tự làm. Ví dụ, thay vì:
logging.debug("datastructure: %r" % complex_dict_structure)
chắc chắn rằng bạn làm:
logging.debug("datastructure: %r", complex_dict_structure)
vì trong khi họ nhìn tương tự, phiên bản đầu tiên phải gánh chịu repr() có giá ngay cả khi nó tàn tật.Phiên bản thứ hai tránh điều này. Tương tự, nếu bạn cuộn của riêng bạn, tôi muốn đề nghị một cái gì đó như:
def debug_stdout(sfunc):
print(sfunc())
debug = debug_stdout
gọi qua:
debug(lambda: "datastructure: %r" % complex_dict_structure)
sẽ, một lần nữa, tránh những phí nếu bạn vô hiệu hóa nó bằng cách thực hiện:
def debug_noop(*args, **kwargs):
pass
debug = debug_noop
Chi phí của việc tính toán các chuỗi đó có thể không quan trọng trừ khi chúng là 1) đắt tiền để tính toán hoặc 2) câu lệnh gỡ rối nằm ở giữa, ví dụ: một vòng lặp n^3 hoặc gì đó. Không phải là tôi sẽ biết gì về điều đó.
- 1. Gỡ lỗi/in trong tập lệnh Hubot
- 2. Làm cách nào để gỡ lỗi các thủ tục đã lưu bằng lệnh in?
- 3. "sử dụng nghiêm ngặt" chỉ trong gỡ lỗi?
- 4. segfault chỉ khi KHÔNG sử dụng trình gỡ lỗi
- 5. ToString() chỉ hữu ích để gỡ lỗi?
- 6. REMOTELY Gỡ lỗi PHP Sử dụng Eclipse
- 7. Làm cách nào để gỡ lỗi tập lệnh sử dụng stdin với ipython?
- 8. Gỡ lỗi Sql chèn vào câu lệnh bằng cách sử dụng câu lệnh chọn
- 9. Làm cách nào để sử dụng xdebug để gỡ lỗi chỉ một máy chủ ảo?
- 10. Hiệu suất hoạt động của việc sử dụng các câu lệnh in trong tập lệnh Python
- 11. Làm cách nào để sử dụng trình gỡ lỗi gdb MinGW để gỡ lỗi chương trình C++ trong Windows?
- 12. Làm thế nào để sử dụng fiddler để gỡ lỗi?
- 13. Gỡ lỗi dòng lệnh của ứng dụng iOS Simulator?
- 14. Sử dụng better_errors làm trình gỡ lỗi?
- 15. lỗi khi sử dụng nrepl-jack-in
- 16. CÁCH SỬ DỤNG Pycharm để gỡ lỗi kịch bản python?
- 17. Gỡ lỗi ứng dụng hadoop
- 18. Cách gỡ lỗi lệnh Django trong PyCharm
- 19. Làm thế nào để in một var bằng cách sử dụng echo o in trong một tập tin NDK-xây dựng Android.mk để gỡ lỗi biên dịch?
- 20. Sử dụng câu lệnh If in a MVC Razor View
- 21. Nhược điểm chỉ gỡ lỗi trong C++?
- 22. Chỉ định nguồn để gỡ lỗi bằng Netbeans
- 23. iOS Binary Link với thư viện để gỡ lỗi chỉ
- 24. Lỗi trong câu lệnh Where in LINQ
- 25. Tôi làm cách nào để gỡ lỗi tập lệnh Perl?
- 26. In tên hàm gọi tới nhật ký gỡ lỗi
- 27. Cách sử dụng phiên bản gỡ lỗi của libc
- 28. Cách gỡ lỗi gỡ lỗi khỏi ứng dụng Express?
- 29. Gỡ lỗi khi sử dụng bộ nhớ cache require.js
- 30. Lỗi ghi nhật ký để gỡ lỗi và gỡ lỗi, thông tin để stdout với log4j
Có lẽ tốt hơn trong thời gian dài để sử dụng mô đun [logging] (http://docs.python.org/library/logging.html) được cung cấp hơn cuộn của riêng bạn (mặc dù nó trông phức tạp hơn). – mgiuca
Đúng, nhưng thật đáng giá để hiểu cách một * có thể tự cuộn. –
Thật vậy. Ở trên là một ý tưởng tốt về cách thức hoạt động của 'logging' (ở mức rất đơn giản). – mgiuca