2020-04-16

파이썬에서 객체의 사용 가능한 메서드가 type hint로 뜨지 않을 때

0. 궁금증의 발단은 이러했다.



내가 하던 짓 :

엑셀 작업을 반복적으로 처리해야 할 일이 생겼는데

엑셀의 자체 매크로 기능을 사용하기엔 한계점이 많다보니

해당 작업을 파이썬으로 진행해보려고 openpyxl을 사용해보던 중이었다.



위의 사진 설명 :

엑셀 파일을 wb(workbook)이라는 변수명으로 open한 뒤,

wb 중에서 active sheet를 ws(worksheet)라는 변수명으로 담았다.

wb.active로 ws를 만들었을 때에나, wb['작업할 시트 이름']으로 불러올 때에나

둘 다 type()을 찍어보면 아래의 사진처럼 같은 클래스라는 것을 알 수 있었다.

openpyxl.워크시트.워크시트.크시트...

PyCharm과 같은 IDE에서 ws.를 입력했을 때 사용 가능한 객체의 메서드들이 나오는 것

(들을 줄여서 type hinting이라고 한다)

들을 한 번에 볼 수 있는 (built-in 함수) dir()도 있었다.

근데 불편하다. 언제 그걸 하나하나 print(dir(o))를 찍어보고 앉아있는가..



대체 왜 wb.active와 wb['작업할 시트 이름']의 반환 객체는 같은데

하나는 type hinting이 뜨고, 다른 하나는 뜨지 않는걸까.

+ 여담으로, wb.get_sheet_by_name() 메서드도 사용 가능했지만

DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
--> 당신이 쓰는건 낡은 방식이니까 새로운 방식을 사용하라는 권고문

이라는 권고 아닌 경고문이 뜨다 보니.. 편하게 딕셔너리처럼 다루는 방식을 차용했다.



1. 그래서 패키지를 뜯어보았다.


빨간색 밑줄 친 부분을 파이썬에선 DocString이라고 부른다.

wb.active는 자체적으로 docstring에서 타입을 지정해주고 있었다.

하지만 딕셔너리처럼 직관적이게 불러오는 방식에선

해당 타입을 지정해주지 못해서 관련 메서드를 확인할 수 없었던 것이었다.



2. 그럼 손가락 빨고 지켜봐야 하는가? No!!



이 불편한 사태를 지켜봐야 하는가?

그래서 방법이 있다.



PyCharm의 공식 문서에 따르면

해당 엘리먼트에 대고 'Alt + Enter'를 눌러서 Add type hint for를 선택해서

수동으로 타입을 지정해주면 된다고 한다.



문법은 위의 사진처럼

ws: 뒤에 해당 클래스를 지정해주는 방식으로 사용하면 된다.

해당 클래스를 찾아 들어가는 경로가 좀 다른데
(type을 출력했을 땐 openpyxl.worksheet.worksheet.Worksheet 였지만
위의 사진은 openpyxl.workbook.workbook.Worksheet 으로 적었다.)

결과적으론 Worksheet라는 클래스를 사용한다는 점이 같기 때문에

크게 신경쓰지 않아도 된다.



3. 잡담

사실 이 문제를 굉장히 오래 고민해왔다.

numpy나 pandas, PIL 등

다른 패키지를 사용하면서도 겪었던 저 type hint가 뜨지 않았던 문제로 인해

documents를 정독해가며 작업 코드를 만드는게 번거로웠기 때문..

근데 의외로 간단한 문법으로 해당 문제를 해결했다.



작업을 편리하게 진행할 수 있도록 도와주는 type hinting

적극적으로 활용해보자.

댓글 없음:

댓글 쓰기