일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- leetcode
- MAPF
- Go-lang
- 구조 패턴
- study
- 오블완
- docker
- Monthly Checklist
- ssh
- 생성 패턴
- terraform
- 지표
- PostgreSQL
- Til
- 디자인 패턴
- DevOps
- github
- AWS
- Rust
- 논문 정리
- 경로 계획 알고리즘
- AWS 비용 절감
- Playwright
- 청첩장 모임
- 도커 주의사항
- 티스토리챌린지
- 실용주의 프로그래머
- 14일 공부
- amazon ecs
- 신혼 여행
- Today
- Total
밤 늦게까지 여는 카페
[Python] DeepDiff 라이브러리 사용 중 8.0.0 버전부터 갑자기 동작이 바뀌었다면? 범인은 threshold_to_diff_deeper 본문
[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 가릴 것 없이 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로 판단할 수 있도록 기능을 추가한 것이었습니다.
- github issue 참고: https://github.com/seperman/deepdiff/issues/500
- README.md 참고: https://github.com/seperman/deepdiff/blob/6d8a4c7c32d5ac57919955954790be994d01fe57/README.md?plain=1#L32
DeepDiff 객체를 생성할 때 threshold_to_diff_deeper 파라미터에 0을 대입하면 기존대로 동작한다는 근본적인 해결 방법도 알게 되었습니다!
역시 사용하는 라이브러리 버전을 정확히 관리하지 않으면 이렇게 고생하게 되네요... ㅎㅎ
'For Fun > 잡학 지식' 카테고리의 다른 글
[오라클 클라우드 프리티어 사용기#1] sudo dnf install 명령 동작하지 않는 현상 feat. swap 메모리 설정 방법 (1) | 2025.01.20 |
---|---|
DNS 조회 동작 방식 간단 정리 (2) | 2025.01.08 |
대칭키 암호 알고리즘이란? feat. https 공부하기 (0) | 2024.11.16 |
[ROS] clients wants service A to have md5sum ~~~ 에러 해결 기록 (0) | 2024.10.10 |
HTTP 캐싱 정책 및 무효화 방법 - js, css 파일을 변경하고 웹서비스를 배포했는데 왜 적용이 안되지? (0) | 2024.09.26 |