본문 바로가기

진리는어디에/Python

[Python] 파이썬용 print_r

php에서는 print_r이라는 유용한 함수가 있어, 특정 객체가 가지고 있는 값들을 재귀적으로 따라 들어가며 모든 변수들의 값을 다 보여준다. python에도 pprint 라는 모듈이 있긴 하지만 변수가 객체인 경우에는 더 이상 재귀적으로 따라 들어가지 않고 해당 객체의 주소만 프린트하고 종료한다.

결론은 불편하다. 그래서 만들었다. 파이썬용 print_r :

만들고 보니 역시 세상은 넓고 천재는 많다는 사실을 다시 한번 깨달았다. var_dump(https://github.com/sha256/python-var-dump)라고 변수 이름 부터 타입까지 아주 깔끔하게 뽑아 주는 라이브러리를 누가 만들어 github에 올려 놓았다. 자세한 사항은 위 링크를 따라 가보면 된다(만일 링크가 깨져 있다면 어쩔수 없이 아래 코드를 쓰면 된다..;;)

import pprint class SomeName : ​​​​def __init__(self) : ​​​​​​​​self.integer_member = 0 ​​​​​​​​self.float_member = 0.0 ​​​​​​​​self.string_member = 'string_data' ​​​​​​​​self.list_member = ['L', 'I', 'S', 'T'] ​​​​​​​​self.obj_list_member = [] ​​​​​​​​self.map_member = {} ​​​​ name = SomeName() name.map_member['key_1'] = SomeName() name.map_member['key_2'] = SomeName() name.obj_list_member.append(SomeName()) name.obj_list_member.append(SomeName()) ​​ def print_r(obj, indent=0) : ​​​​try : ​​​​​​​​obj.__dict__ ​​​​​​​​print(str(obj.__class__)), '{' ​​​​​​​​attrs = vars(obj) ​​​​​​​​for key, val in attrs.items() : ​​​​​​​​​​​​print('\t'*(indent+1) + str(key) + ':'), ​​​​​​​​​​​​print_r(val, indent+1) ​​​​​​​​print('\t'*indent + '}') ​​​​​​​​ ​​​​except AttributeError : ​​​​​​​​if isinstance(obj, dict) : ​​​​​​​​​​​​print('') ​​​​​​​​​​​​for k, v in obj.items() : ​​​​​​​​​​​​​​​​print('\t'*(indent+1), k,':'), ​​​​​​​​​​​​​​​​print_r(v, indent+1) ​​​​​​​​​​​​​​​​ ​​​​​​​​elif isinstance(obj, list) : ​​​​​​​​​​​​print('') ​​​​​​​​​​​​index = 0 ​​​​​​​​​​​​for v in obj : ​​​​​​​​​​​​​​​​print('\t'*(indent+1), index,':'), ​​​​​​​​​​​​​​​​print_r(v, indent+1) ​​​​​​​​​​​​​​​​index +=1 ​​​​​​​​else : ​​​​​​​​​​​​print(str(obj)) #print_r 테스트 print_r(name) #pprint 테스트 pprint.pprint(name.__dict__, indent = 2)

결과 :

$ python main.py __main__.SomeName { ​​​​​​​​float_member: 0.0 ​​​​​​​​string_member: string_data ​​​​​​​​list_member: ​​​​​​​​​​​​​​​​0 : L ​​​​​​​​​​​​​​​​1 : I ​​​​​​​​​​​​​​​​2 : S ​​​​​​​​​​​​​​​​3 : T ​​​​​​​​obj_list_member: ​​​​​​​​​​​​​​​​0 : __main__.SomeName { ​​​​​​​​​​​​​​​​​​​​​​​​float_member: 0.0 ​​​​​​​​​​​​​​​​​​​​​​​​string_member: string_data ​​​​​​​​​​​​​​​​​​​​​​​​list_member: ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​0 : L ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​1 : I ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​2 : S ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​3 : T ​​​​​​​​​​​​​​​​​​​​​​​​obj_list_member: ​​​​​​​​​​​​​​​​​​​​​​​​integer_member: 0 ​​​​​​​​​​​​​​​​​​​​​​​​map_member: ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​​​​​1 : __main__.SomeName { ​​​​​​​​​​​​​​​​​​​​​​​​float_member: 0.0 ​​​​​​​​​​​​​​​​​​​​​​​​string_member: string_data ​​​​​​​​​​​​​​​​​​​​​​​​list_member: ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​0 : L ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​1 : I ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​2 : S ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​3 : T ​​​​​​​​​​​​​​​​​​​​​​​​obj_list_member: ​​​​​​​​​​​​​​​​​​​​​​​​integer_member: 0 ​​​​​​​​​​​​​​​​​​​​​​​​map_member: ​​​​​​​​​​​​​​​​} ​​​​​​​​integer_member: 0 ​​​​​​​​map_member: ​​​​​​​​​​​​​​​​key_1 : __main__.SomeName { ​​​​​​​​​​​​​​​​​​​​​​​​float_member: 0.0 ​​​​​​​​​​​​​​​​​​​​​​​​string_member: string_data ​​​​​​​​​​​​​​​​​​​​​​​​list_member: ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​0 : L ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​1 : I ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​2 : S ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​3 : T ​​​​​​​​​​​​​​​​​​​​​​​​obj_list_member: ​​​​​​​​​​​​​​​​​​​​​​​​integer_member: 0 ​​​​​​​​​​​​​​​​​​​​​​​​map_member: ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​​​​​key_2 : __main__.SomeName { ​​​​​​​​​​​​​​​​​​​​​​​​float_member: 0.0 ​​​​​​​​​​​​​​​​​​​​​​​​string_member: string_data ​​​​​​​​​​​​​​​​​​​​​​​​list_member: ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​0 : L ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​1 : I ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​2 : S ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​3 : T ​​​​​​​​​​​​​​​​​​​​​​​​obj_list_member: ​​​​​​​​​​​​​​​​​​​​​​​​integer_member: 0 ​​​​​​​​​​​​​​​​​​​​​​​​map_member: ​​​​​​​​​​​​​​​​} } <__main__.SomeName instance at 0x7fdf87ccce60>

부록 1. 같이 읽으면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!