IceCream 라이브러리 소개

프로그래밍하는 동안 오류는 거의 불가피합니다. 사실, 프로그래머는 오류 없는 코드를 만들기 위해 디버깅에 상당한 시간을 소비합니다.디버깅하는 동안 print() 문을 사용하여 파이프라인의 흐름을 이해하고 예기치 않은 동작을 발견하는 방법은 가장 널리 채택되는 디버깅 접근 방식입니다. 그러나 print()를 사용하면 다음과 같은 많은 주의 사항이 있습니다.

  • Print 문은 일반적으로 사용자에게 출력을 표시하기 위한 것입니다. 프로그래머가 디버깅을 위해 print()를 사용하는 경우 디버깅이 끝난 후 프로그래머는 디버깅을 위해 의도된 특정 print() 문만 제거하는 데 주의해야 합니다.
  • 종종 디버깅 중에 여러 변수를 차례로 출력할 수 있습니다. 이러한 경우 프로그래머는 가독성을 높이기 위해 출력 형식을 수동으로 지정해야 합니다.

var_1 = 1
var_2 = 2
print(var_1)
print(var_2)

1
2

위의 예시에서 두 개의 변수를 출력합니다. 여기에서는 첫 번째 변수가 var_1이고 두 번째 변수가 var_2라는 것을 알고 있지만 변수의 수가 증가함에 따라 어떤 출력이 어떤 변수에 해당하는지 파악하기 위해 코드와 출력 사이를 왔다 갔다 해야 할 수도 있습니다.

물론 아래와 같이 더 자세한 내용을 출력할 수 있지만 작업이 추가될 뿐입니다.

var_1 = 1
var_2 = 2
print(“var_1 =”, var_1)
print(“var_2 =”, var_2)

var_1 = 1
var_2 = 2
  • 프로그래머는 줄 번호, 함수 이름 및 입력 등을 출력하는 데 관심이 있을 수 있으며, 이는 길고/많은 print() 문을 작성해야 하는 번거로움이 있습니다.
  • 대부분의 상황에서 코드베이스는 단 하나의 파일로 제한되지 않습니다. 대신 파이프라인을 형성하는 여러 파일이 있죠. 이러한 경우 디버깅 중에 파일 이름을 표시하는 데 관심이 있을 수 있으며, 이는 print()에서 매우 번거로울 수 있습니다.

위의 이유 때문에 print()가 디버깅을 위한 별로 좋지 않은 옵션이 됩니다.

하지만, Python에는 훌륭한 대안이 있습니다.




IceCream 라이브러리 소개

IceCream은 최소한의 코드로 쉽게 디버깅하고 읽을 수 있게 해주는 Python 라이브러리입니다.

이번 포스팅에서는 널리 사용되는 출력 표현식, 변수 이름, 함수 이름, 줄 번호, 파일 이름 등에 대해서 설명해 보겠습니다.


IceCream 설치하기

pip를 사용하여 icecream 라이브러리를 설치할 수 있습니다.

Collecting icecream
  Downloading icecream-2.1.3-py2.py3-none-any.whl (8.4 kB)
Requirement already satisfied: colorama>=0.3.9 in c:\users\82108\anaconda3\lib\site-packages (from icecream) (0.4.4)
Collecting asttokens>=2.0.1
  Downloading asttokens-2.2.1-py2.py3-none-any.whl (26 kB)
Collecting executing>=0.3.1
  Downloading executing-1.2.0-py2.py3-none-any.whl (24 kB)
Requirement already satisfied: pygments>=2.2.0 in c:\users\82108\anaconda3\lib\site-packages (from icecream) (2.10.0)
Requirement already satisfied: six in c:\users\82108\anaconda3\lib\site-packages (from asttokens>=2.0.1->icecream) (1.16.0)
Installing collected packages: executing, asttokens, icecream
Successfully installed asttokens-2.2.1 executing-1.2.0 icecream-2.1.3
Note: you may need to restart the kernel to use updated packages.


IceCream 로드하기

이 라이브러리를 사용하기 위해 표준 규칙(ic)을 적용하겠습니다.


IceCream 시작하기

IceCream 라이브러리를 사용하는 것은 print 문만큼 간단합니다. print()를 ic()로 교체하면 끝입니다.

ic(var_1)
ic(var_2)

ic| var_1: 1
ic| var_2: 2

print()와의 차이점에 주목해 보세요. ic()는 값 뿐만 아니라 변수의 이름도 출력합니다. IceCream은 변수에만 국한되지 않습니다. 오히려 함수, 클래스 등에 다양하게 사용할 수 있습니다.

def func(num):
ooooreturn num * 2

ic(func(3))

ic| func(3): 6

와우!! 메서드의 이름(func), 전달된 인수(3) 및 출력(6)값을 함께 출력해 줍니다.

ceCream을 사용한 디버깅은 일반 Python 데이터 구조에도 적용할 수 있습니다. Python dictionary의 예는 다음과 같습니다.

sample_dict = {1:”A”, 2:”B”, 3:”C”}
ic(sample_dict[1])

ic| sample_dict[1]: 'A'


실험 확인

많은 경우 프로그래머는 print()를 사용하여 프로그램의 흐름을 결정하기 위해 아래와 같이 의미 있는(때로는 임의의) 명령문을 표시합니다.


def func(input_num):
ooooif input_num == 1:
ooooooooprint(“If Executed!”)
oooo

ooooelse:
ooooooooprint(“Else Executed!”)
oooo


Ice Cream을 사용하면 이러한 불필요한 코드들을 제거할 수 있습니다.


from icecream import ic

def func(input_num):
if input_num == 1:
ic()

else:
ic()

func(2)


ic()를 호출하면 완료됩니다. 파일 이름, 줄 번호 및 기타 세부 정보(있는 경우 함수 이름과 같은)와 시간을 출력합니다. 단순합니다.


IceCream을 프로젝트 전체에 사용하기

다음으로 모든 Python 파일에서 라이브러리를 가져와야 하는지 궁금하실 수 있습니다. 물론 그럴 필요 없습니다.

모든 프로젝트 파일에서 메서드를 사용할 수 있도록 하려면 아래와 같이 루트 파일의 icecream에서 설치 모듈을 가져오시면 됩니다.

## main_file.py

from icecream import install
install()

from help_file import func
func(2)

## help_file.py

def func(num):
ooooic(num)
ooooreturn 2*num

설치하면 ic()를 프로젝트 전체에서 사용할 수 있습니다.


사용자 지정 접두사 추가하기

위의 출력 결과를 잘 보시면 아시겠지만,  ic() 문의 출력은 “ic|”로 시작합니다. 이것이 IceCream이 제공하는 기본 접두사입니다.

그러나 어떤 이유로든 사용자 지정 접두사로 바꾸려는 경우 그렇게 할 수도 있습니다. 이는 아래와 같이 ic.configureOutput() 메서드에서 접두사 인수를 지정하여 수행됩니다.

from icecream import ic
ic.configureOutput(prefix=’ic debug| -> ‘)

ic(“A custom prefix”)

ic debug| -> 'A custom prefix'
'A custom prefix'


디버깅 후 IceCream 문 삭제

코드를 디버깅한 후에는 불필요한 디버깅 문을 모두 제거할 수 있습니다.

ic() 문은 구문 상 print()와 다르므로 아래와 같이 편집기에서 “ic(” 패턴을 검색하고, 검색되는 모든 구문을 제거할 수 있습니다.

또는 ic.disable()을 사용하여 ic()의 출력을 중지할 수 있습니다. 다시 사용하려면 ic.enable()을 사용하시면 됩니다.


결론

print() 문을 사용한 디버깅은 지저분하고 세련되지 않은 접근 방식입니다. 출력을 해당 디버그 문에 매핑하는 것이 매우 혼란스럽습니다. 또한 출력을 이해하려면 추가 수동 형식 지정이 필요합니다.

위에서 논의한 것처럼 Python의 IceCream 라이브러리는 이에 대한 훌륭한 대안입니다. 최소한의 코드로 디버깅을 쉽고 읽기 쉽게 만듭니다.




답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다