Cảnh báo là một mô-đun thử nghiệm cố gắng cung cấp khả năng kiểm soát mạnh mẽ và linh hoạt hơn đối với các cảnh báo của python. Nó chủ yếu cho phép bạn không chỉ lọc các cảnh báo tùy thuộc vào mô-đun kích hoạt cảnh báo mà còn lọc tùy thuộc vào nơi cảnh báo đến từ đâu
Sử dụng trực tiếp
Thay thế cách nhập thông thường của bạn đối với warnings.warn
, warnings.warn_explicit
và warnings.filter
bằng cách nhập tương tự từ warn
, hãy sử dụng chúng như bình thường trừ khi bạn có một số tùy chọn bổ sung
Để phát ra một cảnh báo
import warn warn.warn["I can use the as usual; this is awesone", DeprecationWarning, stacklevel=1 ]
Để thêm cảnh báo bộ lọc, hãy sử dụng chức năng
import warn warn.filter['default', DeprecationWarning, module='__main__']0 như bình thường
import warn warn.filter['default', DeprecationWarning, module='__main__']
Sử dụng miễn là bạn không sử dụng tùy chọn cụ thể của warn
, việc sử dụng
import warn warn.filter['default', DeprecationWarning, module='__main__']2 sẽ có tác dụng chính xác giống như gọi
warnings.filter
và ảnh hưởng đến tất cả các cảnh báo được phát raChức năng bổ sung
Chức năng bổ sung chính của mô-đun cảnh báo là có thể lọc các cảnh báo không chỉ bởi những gì _trigger_ chúng, mà cả những gì _emit_ chúng. Ví dụ
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=2
# downstream.py from dependency import deprecated_function def feature[]: # I will trigger the warning. deprecated_function[]
Mặc dù thư viện chuẩn của Python chỉ cho phép lọc theo mô-đun _trigger_ cảnh báo [ở trên mô-đun
import warn warn.filter['default', DeprecationWarning, module='__main__']4 và điều này chỉ khi
import warn warn.filter['default', DeprecationWarning, module='__main__']5 đặt chính xác
import warn warn.filter['default', DeprecationWarning, module='__main__']6,
warn
cho phép bạn lọc tùy thuộc vào mô-đun _emitter_ [ở đây import warn warn.filter['default', DeprecationWarning, module='__main__']8]. Để làm như vậy, hãy sử dụng từ khóa
import warn warn.filter['default', DeprecationWarning, module='__main__']9 của
import warn warn.filter['default', DeprecationWarning, module='__main__']2, từ khóa này nhận một chuỗi hoặc một biểu thức chính quy
import warn warn.filterwarnings['error', DeprecationWarning, emodule='dependency']
Khỉ Vá thư viện chuẩn
Chức năng của cảnh báo thường chỉ khả dụng nếu bạn sử dụng rõ ràng các chức năng được hiển thị warn
. Mặc dù đôi khi có thể hữu ích khi sử dụng chức năng cảnh báo với mô-đun sử dụng thư viện tiêu chuẩn
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=22
Đối với trường hợp sử dụng này, chúng tôi cung cấp chức năng
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=23 sẽ thay thế khỉ vá thư viện tiêu chuẩn và tự động cung cấp chức năng của
warn
cho tất cả các mô-đun được nhập sau khi áp dụng bản váChức năng
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=25 cũng được cung cấp và cố gắng hủy bản vá của
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=22. Mặc dù bất kỳ mô-đun nào giữ lại tham chiếu đến hàm
warn
, # dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=28 và
import warn warn.filter['default', DeprecationWarning, module='__main__']0 vẫn sẽ sử dụng các chức năng của mô-đun
warn
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=23 và
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=25 giữ số lượng tham chiếu về số lần từng được gọi để gỡ bản vá chỉ khi cần thiết, do đó sẽ an toàn khi lồng các cuộc gọi
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=23 cũng có thể được sử dụng làm trình quản lý bối cảnh để tự động hủy bản vá khi thoát khỏi trình quản lý bối cảnh
Nhập và sử dụng Styleguide
Do tính chất thử nghiệm của mô-đun này, nên có một số hướng dẫn về phong cách khuyên kỳ lạ. Cụ thể, bạn được khuyến khích sử dụng tên đủ điều kiện khi gọi nhập, cả khi sử dụng mô-đun warn
cũng như khi sử dụng mô-đun
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=22 của thư viện tiêu chuẩn. Ví dụ
import warnings warnings.warn['This is a good way of using warning'] ######## from warnings import warn warn['Advance features of `warn` will not be available....']
Bản vá khỉ và mô-đun đã biên dịch
Biên dịch các mô-đun truy cập trực tiếp vào triển khai C của mô-đun
# downstream.py from dependency import deprecated_function def feature[]: # I will trigger the warning. deprecated_function[]6. Do đó, Monkey Patching không có tác dụng. Chúng tôi nhận thức được sự hạn chế
Làm thế nào nó hoạt động
Bộ lọc cảnh báo Python được yêu cầu phải là bộ năm với các loại và giá trị bị hạn chế, đặc biệt là để tương thích với việc triển khai c hiệu quả của thư viện tiêu chuẩn python
Để tương tác với thư viện tiêu chuẩn
# dependency.py import warn def deprecated_function[]: # the warning is emitted here warn.warning["I am a deprecation warning", DeprecationWarning, stacklevel=22, khi sử dụng chức năng cụ thể của
warn
, chúng tôi thực sự đưa một bộ năm giả mạo không hoạt động vào # downstream.py from dependency import deprecated_function def feature[]: # I will trigger the warning. deprecated_function[]9 và sử dụng nó làm khóa cho proxy-dict lưu trữ các tham số thực tế
Điều này cho phép hoàn toàn tương thích ngược với mô-đun cảnh báo và đảm bảo rằng trong trường hợp xấu nhất, các quy tắc bạn đặt bằng cách sử dụng mô-đun warn
sẽ không có tác dụng
Chúng tôi thực sự hoan nghênh bất kỳ sửa đổi nào đối với Core Python cho phép có các bộ lọc cảnh báo tùy chỉnh để làm cho điều này ít bị hack hơn
Khi nào thì sử dụng warn
import warn warn.filterwarnings['error', DeprecationWarning, emodule='dependency']2 vẫn đang trong quá trình thử nghiệm và chúng tôi chưa khuyến nghị đưa nó vào sản xuất. Đầu tiên, vì đây là triển khai python thuần túy, tùy thuộc vào số lượng cảnh báo mà cơ sở mã của bạn có, bạn có thể nhận thấy hiệu suất giảm
import warn warn.filterwarnings['error', DeprecationWarning, emodule='dependency']2 cực kỳ thú vị cho thử nghiệm tích hợp và thử nghiệm đơn vị. Đặc biệt, chúng tôi khuyên bạn nên bật có chọn lọc cảnh báo là lỗi cho tất cả các phụ thuộc trực tiếp của mình. Điều này thường khả thi với mô-đun cảnh báo python mặc định, trừ khi cảnh báo được đưa ra tại thời điểm nhập hoặc nếu thư viện cơ bản không sử dụng từ khóa
import warn warn.filter['default', DeprecationWarning, module='__main__']6. Nói chung, bạn có thể muốn xem xét bật cảnh báo là lỗi trên toàn cầu và tắt chúng trên cơ sở từng mô-đun nếu bạn quyết định chúng là dương tính giả
import warn warn.filterwarnings['error', DeprecationWarning, emodule='dependency']2 cũng cực kỳ hữu ích khi phát triển cục bộ để đảm bảo bạn phát triển mã của mình càng sớm càng tốt mà không cần sử dụng chức năng có thể bị xóa trong tương lai gần