Sự khác biệt giữa warnings.warn()và logging.warn()về những gì chúng làm và cách chúng nên được sử dụng?
Sự khác biệt giữa warnings.warn()và logging.warn()về những gì chúng làm và cách chúng nên được sử dụng?
Câu trả lời:
Một ngoại lệ đưa ra một ngoại lệ có thể bị bắt hoặc bỏ qua như mong muốn, và tùy chọn kia thêm một mục vào nhật ký dựa trên cấp độ ghi nhật ký hiện tại. Một cái nên được sử dụng khi một cái cảnh báo về nhiều thứ khác nhau trong mã, và cái kia nên được sử dụng khi ghi nhật ký.
logging.captureWarnings()). Theo mặc định, các thông báo cảnh báo chỉ hiển thị một lần, như @cxrodgers đã giải thích để yêu cầu người dùng thay đổi mã của mình. Tuy nhiên, ghi nhật ký vào cái khác và tài liệu tất cả các cảnh báo có thể được định cấu hình những gì sẽ hiển thị chi tiết. Cảnh báo có thể được nâng lên thành ngoại lệ bằng cách sử dụng lỗi -W.
Tôi đồng ý với câu trả lời khác - logginglà để ghi nhật ký và warninglà để cảnh báo - nhưng tôi muốn bổ sung thêm chi tiết.
Dưới đây là HOWTO kiểu hướng dẫn đưa bạn qua các bước sử dụng loggingmô-đun.
https://docs.python.org/3/howto/logging.html
Nó trực tiếp trả lời câu hỏi của bạn:
warning.warn () trong mã thư viện nếu vấn đề có thể tránh được và ứng dụng khách nên được sửa đổi để loại bỏ cảnh báo
logging.warning () nếu ứng dụng khách không thể làm gì với tình huống này, nhưng sự kiện vẫn cần được lưu ý
logging.warningchỉ ghi nhật ký một cái gì đó ở WARNINGcấp độ, giống như cách logging.infoghi nhật ký ở INFOcấp độ và logging.errorghi nhật ký ở ERRORcấp độ. Nó không có hành vi đặc biệt.
warnings.warnphát ra một Warning, có thể được in ra stderr, bị bỏ qua hoàn toàn hoặc được ném ra như bình thường Exception(có thể gây ra lỗi ứng dụng của bạn) tùy thuộc vào Warninglớp con chính xác được phát ra và cách bạn đã định cấu hình Bộ lọc Cảnh báo của mình . Theo mặc định, các cảnh báo sẽ được in tới stderrhoặc bị bỏ qua.
Các cảnh báo được đưa ra warnings.warnthường hữu ích để biết, nhưng dễ bỏ sót (đặc biệt nếu bạn đang chạy một chương trình Python trong quy trình nền và không nắm bắt được stderr). Vì lý do đó, có thể hữu ích nếu họ đăng nhập.
Python cung cấp tích hợp sẵn giữa loggingmô-đun và warningsmô-đun để cho phép bạn làm điều này; chỉ cần gọi logging.captureWarnings(True)khi bắt đầu tập lệnh của bạn và tất cả các cảnh báo do warningsmô-đun phát ra sẽ tự động được ghi ở mức WARNING.
Bên cạnh lời giải thích kinh điển trong tài liệu chính thức
warning.warn () trong mã thư viện nếu vấn đề có thể tránh được và ứng dụng khách nên được sửa đổi để loại bỏ cảnh báo
logging.warning () nếu ứng dụng khách không thể làm gì với tình huống này, nhưng sự kiện vẫn cần được lưu ý
Cũng cần lưu ý rằng, theo mặc định warnings.warn("same message")sẽ chỉ hiển thị một lần. Đó là một sự khác biệt đáng chú ý lớn. Trích dẫn từ tài liệu chính thức
Việc lặp lại một cảnh báo cụ thể cho cùng một vị trí nguồn thường bị loại bỏ.
>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>