DeepDiff Python

Giải pháp được sử dụng ở đây là giữ chính sách dưới dạng chuỗi có định dạng JSON trong từ điển trạng thái. Tuy nhiên, điều này có nghĩa là nếu DeepDiff được thực hiện trên các chuỗi, thì khả năng xảy ra lỗi cao chỉ do định dạng và thứ tự, ngay cả khi các chính sách giống nhau. Vì vậy, trước tiên, nếu có thuộc tính Chính sách, hãy thực hiện DeepDiff chỉ JSON được phân tích cú pháp từ chuỗi của cả hai, sau đó nếu chúng khớp nhau, hãy xóa các phần tử khỏi từ điển. Sau đó, có một DeepDiff khác trên phần còn lại của trạng thái, giờ đây sẽ không bị lỗi do các chuỗi chính sách đã bị xóa. Có một chi tiết thú vị khác cần lưu ý ở đây. Bằng cách xóa chính sách khỏi định nghĩa trạng thái mong muốn, nó ngăn việc tra cứu chính sách trong tương lai và so sánh chính sách với trạng thái hiện tại, vì cả hai chỉ được thực hiện nếu có khóa Chính sách. Khi người dùng cập nhật chính sách, khóa sẽ được giới thiệu lại và toàn bộ quá trình này sẽ diễn ra một lần nữa. """ nếu 'Chính sách' trong wish_filtered. policy_diff = DeepDiff[json. tải [desired_filtered ['Chính sách']], json. tải [current_filtered ['Chính sách']], bỏ qua_order=True] nếu chính sách_diff. tiều phu. debug["Chính sách khóa không tương đương với {0} với khác biệt. {1}". định dạng [tự. key_name, json. kết xuất [chính sách_diff]]] logger. cảnh báo ['Cập nhật cho các chính sách không được thực hiện. Sẽ khẳng định tương đương [không chính xác]'] # TODO. Thay đổi thành trả về Sai sau khi cập nhật chính sách được hỗ trợ trả về Đúng # Xóa các chuỗi chính sách vì chúng tương đương với wish_filtered. pop['Chính sách'] current_filtered. pop['Policy'] diff = DeepDiff[desired_filtered, current_filtered, ignore_order=True] nếu không khác biệt hoặc len[diff] == 0. trở lại Đúng khác. in [khác]
def test_cache_1D_array_of_numbers_that_do_not_overlap[self]. ignore_order = True cache_size = 5000 max_diffs = 30000 max_passes = 40000 t1 = list[range[1, 30]] t2 = list[range[100, 120]] diff = DeepDiff[t1, t2, ignore_order=ignore_order, max_passes=max_passes, . get_stats[] # Vì không có sự trùng lặp giữa 2 mảng nên mặc dù ignore_order=True nên # thuật toán chuyển sang so sánh theo thứ tự. kỳ vọng_stats = { 'ĐẾM VƯỢT QUA'. 0, 'ĐẾM KHÁC'. 50, 'ĐẾM SỐ LẦN ĐẠT KHOẢNG CÁCH'. 0, 'ĐẠT ĐẾN GIỚI HẠN SỐ LƯỢT TỐI ĐA'. Sai, 'ĐẠT GIỚI HẠN DIFF TỐI ĐA'. Sai } khẳng định kỳ vọng_stats == số liệu thống kê kỳ vọng = {'values_changed'. {'gốc[0]'. {'new_value'. 100, 'giá trị_cũ'. 1}, 'gốc[1]'. {'new_value'. 101, 'giá_trị cũ'. 2}, 'gốc[2]'. {'new_value'. 102, 'giá trị_cũ'. 3}, 'gốc[3]'. {'new_value'. 103, 'giá trị_cũ'. 4}, 'gốc[4]'. {'new_value'. 104, 'giá_trị cũ'. 5}, 'gốc[5]'. {'new_value'. 105, 'giá_trị cũ'. 6}, 'gốc[6]'. {'new_value'. 106, 'giá_trị cũ'. 7}, 'gốc[7]'. {'new_value'. 107, 'giá_trị cũ'. 8}, 'gốc[8]'. {'new_value'. 108, 'giá_trị cũ'. 9}, 'gốc[9]'. {'new_value'. 109, 'giá_trị cũ'. 10}, 'gốc[10]'. {'new_value'. 110, 'giá_trị cũ'. 11}, 'gốc[11]'. {'new_value'. 111, 'giá_trị cũ'. 12}, 'gốc[12]'. {'new_value'. 112, 'giá_trị cũ'. 13}, 'gốc[13]'. {'new_value'. 113, 'giá_trị cũ'. 14}, 'gốc[14]'. {'new_value'. 114, 'giá_trị cũ'. 15}, 'gốc[15]'. {'new_value'. 115, 'giá_trị cũ'. 16}, 'gốc[16]'. {'new_value'. 116, 'giá_trị cũ'. 17}, 'gốc[17]'. {'new_value'. 117, 'giá_trị cũ'. 18}, 'gốc[18]'. {'new_value'. 118, 'giá_trị cũ'. 19}, 'gốc[19]'. {'new_value'. 119, 'giá_trị cũ'. 20}}, 'iterable_item_removed'. {'gốc[20]'. 21, 'gốc[21]'. 22, 'gốc[22]'. 23, 'gốc[23]'. 24, 'gốc[24]'. 25, 'gốc[25]'. 26, 'gốc[26]'. 27, 'gốc[27]'. 28, 'gốc[28]'. 29}} khẳng định mong đợi == diff

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 trong price2
  • 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

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 nhau

Hì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}
2

Hì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 Python

Bạ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 sao

Hì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}
5

Trong đ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}
6

Trong đ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ỏ qua

Hì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}
9

Hì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

Hình ảnh của Tác giả — Sao chép mã ở trên tại đâyBỏ qua Đường dẫn

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

Chủ Đề