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>