이 가이드는 Transforms Python에서 사용 가능한 디버깅 기법에 대한 전체보기를 제공합니다. 오류와 예외에 대한 더 많은 정보는 Python 문서에서 찾을 수 있습니다.
Python 변환을 디버깅하는 데 유용한 도구는 Code Repositories 디버거입니다. 디버거에 대해 더 알아보기.
Python의 traceback은 Java의 stack trace와 동일합니다. Python에서 처리되지 않은 예외는 모두 traceback으로 결과를 내며, 이에는 오류 메시지가 포함된 스택 트레이스가 포함됩니다. 대부분의 Transforms Python 런타임 실패는 traceback으로 표시되므로 traceback을 읽는 방법을 이해하는 것이 중요합니다.
다음 코드 예제를 고려해 보십시오:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
class Stats(object): nums = [] # 숫자 리스트 def add(self, n): # 숫자를 리스트에 추가하는 함수 self.nums.append(n) def sum(self): # 리스트의 합계를 반환하는 함수 return sum(self.nums) def avg(self): # 리스트의 평균을 반환하는 함수 return self.sum() / len(self.nums) # 메인 함수 def main(): stats = Statistics() # Stats 클래스의 객체 생성 stats.add(1) # 1 추가 stats.add(2) # 2 추가 stats.add(3) # 3 추가 print stats.avg() # 평균 출력
이 코드를 실행하면 다음과 같은 추적이 발생합니다:
Copied!1 2 3 4 5 6
Traceback (most recent call last): # 가장 최근에 발생한 오류 트레이스백 File "test.py", line 26, in <module> # test.py 파일의 26번째 줄에서 발생한 오류 main() # main 함수 호출 File "test.py", line 16, in main # test.py 파일의 16번째 줄에서 발생한 오류 stats = Statistics() # Statistics 객체 생성 시도 NameError: global name 'Statistics' is not defined # 오류 메시지: 전역 이름 'Statistics'이(가) 정의되지 않음
Java 스택 추적과 달리, Python traceback은 가장 최근의 호출을 마지막에 보여줍니다. 따라서 아래에서 위로 읽어보면, traceback은 다음을 보여줍니다:
NameError
.
많은 Python 내장 예외 클래스들이 있지만, 코드에서는 자체 예외 클래스를 정의할 수 있습니다.global name 'Statistics' is not defined
.
이 메시지에는 디버깅 목적으로 가장 유용한 정보가 포함되어 있습니다.File "test.py", line 26, in <module>
다음으로 문제의 코드 라인 (line 16).이 traceback을 이용하면, 예외가 test.py
의 16번 라인에서 main
메소드에서 발생한다는 것을 알 수 있습니다. 구체적으로, 오류를 일으키는 코드 라인은 stats = Statistics()
이고, 던져진 예외는 NameError
입니다. 이로부터, "Statistics"라는 이름이 존재하지 않는다는 것을 추론할 수 있습니다. 우리의 예제 코드를 다시 보면, "Stats" 대신에 "Statistics"라는 이름을 사용하려고 했던 것 같습니다.
표준 Python 로그 모듈을 사용해야 합니다.
더 자세한 내용은 로그 읽는 방법에 관한 섹션을 참조하십시오.
INFO
-레벨 로그와 그 이상만 저장됩니다.
다음 코드 예제는 어떻게 로그를 출력하여 디버깅에 도움을 줄 수 있는지 보여줍니다:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 필요한 라이브러리와 모듈을 불러옵니다. from transforms.api import transform_df, Input, Output from myproject.datasets import utils import logging # 로깅을 위한 객체를 생성합니다. log = logging.getLogger(__name__) # transform_df 데코레이터를 사용하여 데이터 프레임의 변환을 정의합니다. # 출력 데이터셋의 경로와 입력 데이터셋의 경로를 지정합니다. @transform_df( Output("/path/to/output/dataset"), my_input=Input("/path/to/input/dataset"), ) # 실제 데이터 처리를 수행하는 함수를 정의합니다. def my_compute_function(my_input): # 로그에 입력 데이터의 크기를 출력합니다. log.info("Input size: %d", my_input.count()) # 현재는 어떤 처리도 하지 않고 입력받은 데이터를 그대로 반환합니다. return my_input