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 - logging
là để ghi nhật ký và warning
là để 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 logging
mô-đ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.warning
chỉ ghi nhật ký một cái gì đó ở WARNING
cấp độ, giống như cách logging.info
ghi nhật ký ở INFO
cấp độ và logging.error
ghi nhật ký ở ERROR
cấp độ. Nó không có hành vi đặc biệt.
warnings.warn
phá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 Warning
lớ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 stderr
hoặc bị bỏ qua.
Các cảnh báo được đưa ra warnings.warn
thườ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 logging
mô-đun và warnings
mô-đ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 warnings
mô-đ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")
>>>