warning.warn () so với logging.warning ()


Câu trả lời:


-4

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ý.


23
Theo như tôi hiểu, câu trả lời được chấp nhận là sai. Cả cảnh báo và ghi nhật ký đều không có ngoại lệ. Nhưng in tin nhắn. Tuy nhiên, chúng có một hệ thống khác (Tuy nhiên, có thể tích hợp các cảnh báo vào đăng nhập qua 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.
DerWeh

84

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 ý


59

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.


26

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")
>>>

1
Lưu ý rằng "chỉ hiển thị một lần" là hành vi mặc định dự kiến, nhưng bộ lọc cảnh báo có thể thay đổi điều này.
gerrit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.