본문 바로가기

파이썬-PySide6(PyQt6)

[2/?] Pythonic에 집착하는 분들을 위한 Pyside 팁[feat. __feature__]

728x90

파이써닉이 아니면 불편한 분들 계시죠?

우선 pythonic이 뭔지 모르시는 분들을 위한 설명부터..

안녕하세요? 회사원코딩입니다.

파이썬을 공부하다 보면 이런저런 책에서 이야기하는 "파이써닉"이라는 단어가 종종 튀어나옵니다. Qt 포스팅 하다가 무슨 파이써닉을 꺼내냐는 분도 계실텐데, 사실 제가 Qt를 알려드리는 게 아니고, PySide, 특히 PySide6를 알려드리는 튜토리얼이기 때문에 이 말씀을 먼저 드리는 게 좋겠다는 생각이 듭니다. 사실 파이써닉은 대부분의 파이썬 개발자들 사이에 통하는 일종의 "파이썬다움"인 것 같아요. 파이써닉함이 지켜지지 않은 코드를 읽다 보면 어떤 부분에서는 불쾌해지기도 하죠. (오타쿠인가 싶겠지만 아주 사소한 코드나 변수 가지고도 정말 그렇게 되더라고요..)

'뭐지, 이 분 자바개발 하시다가, 핫하다는 파이썬 대~충 배워서 책이라도 쓰신 건가?'

막 저런 생각도 들어요. 뭔가 신뢰가 안 가기도 하고... 하나를 보면 열을 안다는 말처럼, 책을 읽다가도 기본적인 파이써닉한 문법부터 지켜지지 않았으면, 왠지 모르게 '비효율적인 파이썬 코드일 수도 있겠구나~' 하는 생각도 들고요. 파이써닉한 코드의 예를 들자면, 간단하게는 내장 임포트문이 먼저 나오고, 외부모듈 임포트가 나중에 나와야 한다든지, 변수명은 언더바를 사용한 소문자 스네이크케이스로 한다든지... 등호 좌우는 한 칸씩 띄어줘야 하지만, 괄호 안에 파라미터를 넣을 때는 등호좌우에 빈칸이 없어야 한다든지 하는 가벼운 문법부터, 79칼럼 제한이나, 파이썬다움을 살려주는 각종 컴프리헨션이나 인덱싱, f스트링 같은 제너릭한 표현을 적극 사용한다든지 등등, 특히 변수명에 camelCase를 쓴다는 점에 불쾌해지는 건 내가 경험이 부족하다는 뜻인가? 하는 생각도 하게 되고

아래는 파이썬 공식 홈페이지의 PEP8(파이썬 스타일 가이드) 링크입니다.

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

하여튼 Qt로 GUI를 짜면서도 비슷한 고민들이 있죠. 어딘가 파이써닉하지 않다든지.
구체적으로 표현하자면 이런 느낌이예요.

다소 파이써닉하지 않지만, 문제는 없는 코드.

위 코드는 정통 Qt(C++)스러운 네이밍(get, set 접두어라든지 setWindowTitle같은 camelcase 변수명)이 약간 불편해요. 특히 창 이름(WindowTitle)을 정하는데 굳이 메서드 실행하듯 괄호 안에 문자열을 넣어야 할까요?
간단히 프로퍼티 입력하듯 self.window_title = "My App" 방식으로 만들 수도 있을텐데요.

이런 고민을 담아서 대략 아래와 같이 코드를 써볼 수 있겠죠?

완벽하진 않지만, 만족할 만한 파이써닉 코드.

아래쪽 코드 기준으로 13번, 15번, 16번 라인에 변화를 줘봤습니다. 어떠신가요? 

 

 

 

아래쪽 코드가 훨씬 편안하다고 느끼시는 분들, 많을 거라고 믿습니다.


이제 재미있는 사실을 하나 알려드릴게요. (물론 몰랐던 분들만)

이미 아시는 분들께서는 안 놀라시겠지만, 이처럼 파이써닉하게 코드를 짤 수 있답니다.

짜잔! 오류가 나지 않고 잘 실행되네요^^

사실 이건 PySide(엄밀히는 설치할 때 딸려오는 Shiboken이라는 모듈)에서 자체적으로 제공하는 기능이예요.
조건이 있는데, 아래처럼 임포트구문을 추가하면 된답니다. 

파이참도 아직 제대로 인덱싱을 못해서 빨간펜이 그어지네요. 이런 적이 없었는데...

신박하지 않나요? 개인적으로는 이 기능 하나만 가지고도 PyQt에서 PySide로 갈아탈 이유충분하다고 생각해요.
(어차피 저는 개발자도 아니고, 지금 다니는 회사에서 이런 걸로 남들과 협업할 일은 절대naver 없기 때문이기도 하죠.)

유의하실 점은, 4번라인 임포트를 하시기 전에 import PySide6를 해주셔야 오류가 나지 않습니다.


qt.io 공식 홈페이지에는 이런 예제도 들어 있네요.

__feature__로 이렇게 파이써닉한 문법으로의 스위칭이 가능합니다.

그럼 이 시점에서 궁금한 점이 하나 생기실 거예요.

레퍼런스가 많이 없는 것 같은데, 직접 찾아봐야 하나?

실제로 저는 직접 찾으면서 연습하고 있어요..ㅜ 더 좋은 방법이 있을 것 같기는 한데, 아시면 좀 알려주세요. 지금도 PyQt나 PySide 관련한 유튜브영상이나 책도 몇 권 참고하고 있기는 하지만, 아직 __feature__를 활발하게 사용하는 유저를 찾지는 못했어요. 그래도 다행히 파이참 자동완성 기능변경된 메서드명을 잘 찾아주기 때문파이참으로 공부하고 있어요.

그리고 당연히도 코드가 틀리면 인스턴스 생성조차도 안 되기 때문에, 디버깅(Shift-Alt-F9) 기능을 활용하고 있고요.

예를 들어,

지레짐작으로 입력해보았더니 역시나 오류가 발생했습니다.

setWindowTitle("My App")의 변경된 문법이 set_window_title("My App")일 거라고 짐작하고 코드를 입력한 후 실행해보니 오류가 발생하네요. 에디터창에서 자동완성(Ctrl-Space) 기능을 써봐도, 제대로 된 메서드이름을 잡아주지 않습니다.

제대로 잡아주는 설정방법이 있을 것 같은데, 아직은 방법을 찾지 못했습니다. 바뀌기 전의 메서드명을 참조합니다.

미루어 알 수 있는 점은, __feature__를 임포트한다고 바로 메서드나 속성이름이 변하는 게 아니고, 클래스를 정의하는 시점(아마 MainWindow의 __init__을 실행하는 시점?)에 스위칭이 적용되는 것 같습니다. (정확하진 않아요;)

위 캡쳐화면처럼 12번 라인 super().__init__()에 브레이크포인트 찍고 디버깅을 해보면 아래와 같이 나오거든요.

중단점 찍고(현재라인에서 Ctrl-F8) 디버깅 실행(Shift-Alt-F9)
디버거 콘솔로 이동(이동 단축키는 Alt-5, Alt-우측화살표 누른 후 Shift-Tab)해서 self. 을 입력하면 자동완성 팝업이 뜸.

참고로 코드창에서 마우스를 쓰지 않고 디버거 콘솔로 이동하는 단축키는,
Alt-5(디버그창 선택), Alt-우측화살표(콘솔탭 선택), Shift-Tab(캐럿을 콘솔로 이동) 입니다.

이 상태에서 찾고자 하는 메서드를 찾아낼 수 있겠죠?

이렇게 팝업을 참고하면 코드를 쉽게 완성할 수 있겠죠? 저도 몇 번 해보니까 점점 익숙해지는 것 같아요.

근데 솔직히 말씀드리면 저는 GUI를 매일 짜는 사람도 아니고, 아직 레퍼런스 따라서 연습하는 수준인데, 익숙해질 만 하면 잊어먹고 그래요. 그저 파이써닉하게 짠다는 점 때문에 퍼즐맞추기 같은 느낌도 들고, 그냥 이런 삽질의 과정이 재미있더라고요. 이게 제 직업이었거나 D-day가 있는 일이었다면, 아마도 이렇게 작업하지는 않았을 것 같아요.


'...뭐하러 이런 삽질을 하시는 건지?'

저도, 솔직히 교재나 다른 분들의 포스팅 같은 레퍼런스 참고해서 코딩하는 게 훨씬 빠를 거라고 생각은 해요. 이런 방법을 여러분께 강요하는 것도 절대 아니고요. 근데... 저도 오타쿠 기질이 있나봐요. 결과창을 보며 만족해야 하는데, 이런 걸로 시간낭비 하다가 파이써닉한 문법으로 점철된 코드를 보며 흡족해하고 있는 저를 보면, 이상한 것 같기는 해요. 그냥 취향존중 해줍시다. (그리고 어차피 QtDesigner 쓰시지 않나요?ㅎ)
그저 긴 글 읽어주셔서 감사드립니다.

결론

 

1. from __feature__ import snake_case, true_property 로, 좀 더 파이써닉한 Qt 코드를 짤 수 있다.

2. 파이참 디버깅을 사용하면 변경된 메서드와 속성을 쉽게 찾아낼 수 있다.

3. 파이참 코드창에서 마우스를 한 번도 쓰지 않고 디버거 콘솔에 가서 코드를 입력할 수 있다.

끝.