Khi so sánh hai đối tượng Python, bạn có thể không muốn kiểm tra tập trung vào một số khác biệt nhỏ chẳng hạn như thứ tự của các giá trị trong danh sách
Ví dụ: bạn có thể muốn bài kiểm tra coi[3, 2]
giống như [2, 3]
Tuy nhiên, bạn gặp lỗi khi thứ tự khác
Hình ảnh của tác giả
Có cách nào để bạn có thể bỏ qua thứ tự khi so sánh hai đối tượng Python không?
Hình ảnh của tác giả
Hình ảnh của tác giả
Đó là khi DeepDiff có ích. Trong bài viết này, bạn sẽ tìm hiểu cách sử dụng DeepDiff để ngăn việc so sánh các phần nhất định của đối tượng Python
DeepDiff là gì?DeepDiff là một thư viện Python tìm kiếm đệ quy tất cả các thay đổi trong từ điển, vòng lặp, chuỗi và các đối tượng khác
Để cài đặt DeepDiff, hãy nhập
pip install deepdiff
Lỗi Mô tảKhi so sánh giữa hai đối tượng Python khác nhau bằng cách sử dụng assert
, bạn có thể gặp lỗi tương tự như bên dưới
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
Lỗi xác nhận này không có nhiều thông tin vì chúng tôi không biết chính xác các yếu tố làm cho hai từ điển này khác nhau
Với DeepDiff, chúng ta có thể thấy một lỗi mô tả rõ ràng hơn cho thấy sự khác biệt là gì và sự khác biệt xảy ra ở đâu
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Từ lỗi trên, chúng tôi biết ba điều
- Một mục trong
price1
bị xóa trongprice2
- Mục bị xóa là tại
price1['banana'][2]
- Giá trị của mặt hàng bị loại bỏ là
2
Xem cây
Chế độ xem mặc định của DeepDiff
là
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
0. Để thay đổi chế độ xem thành chế độ xem dạng cây, hãy sử dụng AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
1. Trong chế độ xem dạng cây, bạn có thể duyệt qua cây và xem những mục nào được so sánh với nhauHình ảnh của Tác giả — Sao chép mã ở trên tại đâyBỏ qua thứ tự
Như đã trình bày ở đầu bài viết, bạn có thể bỏ qua thứ tự sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
2Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Đầu ra
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
3 cho thấy không có sự khác biệt giữa hai đối tượng PythonBạn cũng có thể sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
2 để bỏ qua các bản saoHình ảnh của tác giả — Sao chép mã ở trên vào đây Bỏ qua sự khác biệt nhỏ giữa hai số
Bỏ qua đến một chữ số nhất định
Có thể khó chịu khi thấy lỗi xác nhận khi hai số rất gần nhau. Nếu bạn muốn bỏ qua sự khác biệt giữa hai số sau một chữ số cụ thể, hãy sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
5Trong đoạn mã dưới đây, chúng tôi chỉ so sánh hai số đến chữ số thứ hai
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Bỏ qua sự khác biệt bên dưới một Epsilon
Đôi khi, hai số rất gần nhau, nhưng chúng không có chữ số giống nhau. Để bỏ qua những khác biệt nhỏ giữa hai số, hãy sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
6Trong đoạn mã dưới đây, tôi sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
7 để yêu cầu DeepDiff
bỏ qua sự khác biệt nhỏ hơn 0. 001. Vì sự khác biệt giữa 1 và 0. 9999 là 0. 0001, sự khác biệt được bỏ quaHình ảnh của Tác giả — Sao chép mã ở trên tại đây Bỏ qua Trường hợp Chuỗi
Nếu bạn muốn bỏ qua trường hợp chuỗi [. i. e, “Đỏ” và “đỏ”], sử dụng
AssertionError: assert {'apple': 2, 'banana': [3, 2, 2], 'orange': 3} == {'apple': 2, 'banana': [3, 2], 'orange': 3}
9Hình ảnh của Tác giả - Sao chép mã ở trên tại đây Bỏ qua bất bình đẳng NaN
Nếu bạn đã làm việc với một số NaN, bạn có thể biết rằng không phải mọi NaN trong Python đều giống nhau
Hình ảnh của tác giả
Do đó, có thể gây nhầm lẫn khi so sánh các đối tượng chứa các loại NaN khác nhau. [Không phải [3, 2]
0 bằng với [3, 2]
0 sao?]
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Để bỏ qua các loại NaN khác nhau, hãy sử dụng [3, 2]
2
Hình ảnh của Tác giả — Sao chép mã ở trên vào đây. Loại trừ các loại
Đôi khi, bạn có thể không quan tâm liệu một số loại có thay đổi hay không. Để bao gồm các loại dữ liệu nhất định, hãy sử dụng [3, 2]
3
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Bỏ qua kiểu số
[3, 2]
4 vì 2
là số nguyên và [3, 2]
6 là số float. Bạn có thể bỏ qua biến thể trong kiểu số bằng cách sử dụng [3, 2]
7
Hình ảnh của Tác giả - Sao chép mã ở trên vào đâyCắt ngắn Ngày giờ
Khi so sánh giữa hai đối tượng ngày giờ, bạn có thể chỉ muốn đảm bảo rằng chúng giống nhau ở một mức độ nhất định [có cùng giờ, không giống giờ và phút]
Hình ảnh của tác giả
Bạn có thể chỉ định mức độ chính xác của DeepDiff
nên so sánh giữa hai đối tượng ngày giờ bằng cách sử dụng [3, 2]
9
Nếu bạn muốn loại trừ một số đường dẫn nhất định khỏi báo cáo, bạn [2, 3]
0
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây Loại trừ Đường dẫn Regex
Nếu bạn muốn bỏ qua nhiều đường dẫn với một mẫu nhất định, hãy sử dụng [2, 3]
1
Ví dụ: để tránh so sánh [2, 3]
2 với [2, 3]
3 và [2, 3]
4 với [2, 3]
5 , chúng ta chỉ cần bỏ qua các đường dẫn được chỉ định bởi biểu thức chính quy [2, 3]
6 , trong đó [2, 3]
7 là viết tắt của một hoặc nhiều chữ số
Hình ảnh của Tác giả - Sao chép mã ở trên vào đây
Kiểm tra bảng này nếu bạn không quen thuộc với biểu thức chính quy
Sử dụng DeepDiff với pytestĐể sử dụng DeepDiff với pytest, hãy viết [2, 3]
8. Điều này có nghĩa là chúng tôi muốn khẳng định rằng không có sự khác biệt giữa hai đối tượng Python
Hình ảnh của Tác giảKết luận
Xin chúc mừng. Bạn vừa học cách bỏ qua một số thành phần khi so sánh giữa hai đối tượng Python bằng DeepDiff. Tôi hy vọng công cụ này sẽ giúp bạn viết bài kiểm tra và gỡ lỗi mã dễ dàng hơn
Vui lòng chơi và rẽ nhánh mã nguồn của bài viết này tại đây
Khoa học dữ liệu/deepdiff_example. ipynb at master · khuyentran1401/Data-science
Bộ sưu tập các chủ đề khoa học dữ liệu hữu ích cùng với mã và bài viết - Khoa học dữ liệu/deepdiff_example. ipynb tại master ·…
github. com
Tôi thích viết về các khái niệm khoa học dữ liệu cơ bản và chơi với các công cụ khoa học dữ liệu khác nhau. Bạn có thể kết nối với tôi trên LinkedIn và Twitter
Gắn dấu sao cho repo này nếu bạn muốn kiểm tra mã cho tất cả các bài báo tôi đã viết. Theo dõi tôi trên Phương tiện để được thông báo về các bài báo khoa học dữ liệu mới nhất của tôi như thế này