본문 바로가기

진리는어디에/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. 같이 읽으면 좋은 글

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