관리 메뉴

밤 늦게까지 여는 카페

[Python] DeepDiff 라이브러리 사용 중 8.0.0 버전부터 갑자기 동작이 바뀌었다면? 범인은 threshold_to_diff_deeper 본문

For Fun/잡학 지식

[Python] DeepDiff 라이브러리 사용 중 8.0.0 버전부터 갑자기 동작이 바뀌었다면? 범인은 threshold_to_diff_deeper

Jㅐ둥이 2024. 12. 4. 01:00
반응형

안녕하세요. 오늘은 파이썬 라이브러리인 DeepDiff 사용 도중에 겪었던 문제를 공유드리고자 합니다.

 

TL-DR

  • DeepDiff 객체 생성시 threshold_to_diff_deeper=0 파라미터 필수!
    • Ex) DeepDiff(t1, t2, ignore_order=True, threshold_to_diff_deeper=0)
  • SW 버전 관리 시 사용하고 있는 라이브러리 버전도 정확히 관리해야 함!

 

0. DeepDiff 라이브러리란?

DeepDiff 라이브러리는 두 object를 아주 깔끔하게 비교해주는 라이브러리입니다!

 

예시 코드

더보기
from deepdiff import DeepDiff

dict1 = {
    "a":1,
    "b":{
        "c":"d",
        "e":"f",
    }
}
dict2 = {
    "a":1,
    "b":{
        "c":"d",
        "e":"g",
    }
}

dict_diff = DeepDiff(dict1, dict2, ignore_order=True)
print(dict_diff)

class TestDeepDiff:
    def __init__(self, *, member1, member2):
        self.member1 = member1
        self.member2 = member2

test1 = TestDeepDiff(
    member1=1,
    member2=[1,2,3],
)
test2 = TestDeepDiff(
    member1=2,
    member2=[2,3],
)
test_diff = DeepDiff(test1, test2, ignore_order=True)
print(test_diff)

결과

dictionary, class 모두 비교를 잘해준다!

 

위의 예시 코드와 결과와 같이 dictionary, class 가릴 것 없이 object들을 깔끔하게 비교해줍니다.

 

이렇게 object들의 비교를 잘할 수 있으면 어떤 활용 방법이 있을까요?

많은 활용 방법이 있겠지만 값이 어떻게 변경되었는지 추적하기가 매우 쉬워집니다.

 

이를 통해서 alert 값이 0에서 1로 변했을 때 혹은 emergency 값이 False에서 True로 변했을 때 같은 조건을

매번 코드를 작성해서 구현하지 않고 데이터의 형태로 쉽게 관리할 수 있었습니다.

1. 갑작스러운 문제 발생

이렇게 DeepDiff 라이브러리를 잘 사용하고 있었는데 어느날 갑자기 문제가 발생했습니다.

DeepDiff 라이브러리를 사용하는 부분의 코드는 변경된 것이 없는데 갑자기 동작이 이상해진 것입니다.

 

원래는 다음 코드를 실행하면 빈 dictionary가 반환되었습니다.

from deepdiff import DeepDiff

t1 = {
    "key": "include_val",
    "key1": "a",
    "key2": "b",
    "key3": "c",
}

t2 = {
    "key": "include_val",
}
diff = DeepDiff(t1, t2, ignore_order=True)
diff.pop("dictionary_item_removed", None)
print(diff)

 

그런데 갑자기 다음과 같은 결과값이 반환되는 것이었습니다.

갑자기 달라진 결과값?!

 

더 웃긴 것은 제 컴퓨터에서는 여전히 빈 dictionary가 반환되는 것이었죠ㅋㅋㅋㅋ

2. 찾은 원인 - DeepDiff 라이브러리 버전 차이

한참을 고민하다가 문제가 발생한 컴퓨터와 제 컴퓨터에 설치된 DeepDiff 라이브러리의 버전이 다르다는 것을 알 수 있었습니다.

 

DeepDiff 라이브러리 버전을 7.0.1로 변경하는 것으로 임시조치를 할 수 있었고, 다음 패치에서 DeepDiff 라이브러리의 버전을 7.0.1로 명확히 설정해뒀습니다.

 

문제는 임시방편으로 해결했지만 발생한 이유가 궁금하더라고요.

 

DeepDiff 라이브러리 github를 뒤져보니 저와 같은 문제를 겪고 있는 사람이 있었습니다 ㅋㅋㅋ

라이브러리가 8.0.0 버전으로 업데이트 되면서 두 object를 비교할 때 threshold보다 작은 수의 key가 겹치는 경우에는 아예 다른 obejct로 판단할 수 있도록 기능을 추가한 것이었습니다.

DeepDiff 객체를 생성할 때 threshold_to_diff_deeper 파라미터에 0을 대입하면 기존대로 동작한다는 근본적인 해결 방법도 알게 되었습니다!

 

역시 사용하는 라이브러리 버전을 정확히 관리하지 않으면 이렇게 고생하게 되네요... ㅎㅎ

반응형