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 Show Ví dụ: bạn có thể muốn bài kiểm tra coi 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 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 đâyTừ lỗi trên, chúng tôi biết ba điều
Xem câyChế độ xem mặc định của 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 địnhCó 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 đâyBỏ 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ỗiNế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 NaNNế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 Để bỏ qua các loại NaN khác nhau, hãy sử dụng Đô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 Bỏ qua kiểu số
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 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 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 Ví dụ: để tránh so sánh 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 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-scienceBộ 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 |