fender
19k
2020-07-12 10:16:04 작성 2020-07-12 11:06:16 수정됨
16
4746

파이썬을 써보고 느낀 점


얼마전에 같은 주제로 꽤 장문의 글을 썼다가 홀랑 날려 먹은 탓인지 왠지 비슷한 이야기를 길게 적긴 좀 그렇네요. 개인 프로젝트 때문에 파이썬을 수박 겉핥기 수준이나마 배워서 쓰고 있는데 그 과정에서 느낀 점을 간단하게 정리해봅니다.

우선 마음에 들었던 점부터...

동적 스크립팅 언어의 최대 장점이겠지만 확실히 수정과 디버그의 주기가 매우 빠릅니다. 파이참을 IDE로 쓰고 있는데 아직 파이썬 문법에 익숙하지 않음에도 나름 경쾌한 느낌으로 코딩이 가능하더군요.

그리고 튜플이나 리스트 등 기본 자료형에 대한 조작이 꽤 강력합니다. 어쩌면 이건 파이썬의 장점보단 자바 같이 오래된 언어의 단점에 가까울지 모르겠지만, NumPy 같은 라이브러리를 사용하지 않더라도 기본 API 만으로 예컨대 자바의 List나 Map으로 할 수 있는 것에 비하면 훨씬 다양한 조작이 가능합니다.

이건 자바나 C# 같은 언어와 비교할 때 이야기할 수 있는 내용이지만, 어느 정도 다중 상속을 통해 믹스인 패턴을 구현할 수 있다는 것도 스칼라를 자주 쓰는 제 입장에선 상당히 마음에 드는 요소였습니다.

하지만 아직까지 경험한 내용 중 개인적으로 가장 마음에 들었던 건 "매직 메서드"의 존재입니다. 자바스크립트를 사용할 때 가끔 동적 언어의 특징을 활용(또는 '악용')해서 런타임에 임의의 함수나 속성을 추가한다던지 바꾸어치기 한다던지 하는 경우가 있습니다.

파이썬의 경우는 같은 동적 언어로서 역시 비슷하게 활용할 수 있을 뿐 아니라, 디스크립터나 데코레이터 등을 통해 객체의 기본 동작을 상당히 다양하게 변경할 수 있습니다.

관련 기능에 영감을 얻어서 간단한 오픈소스 라이브러리를 만드는 중인데, 아마 대부분의 다른 언어였다면 불가능했을 것 같습니다.

여기까지가 마음에 드는 점이고, 제가 익숙한 언어들에 비해 마음에 들지 않는 점도 꽤 많이 있었습니다.

우선 타이핑 문제... 이건 개발자들 사이에서도 항상 의견이 대립하는 내용이지만, 전 분명 동적 타이핑이 오히려 생산성을 갉아 먹는 경우가 있다고 생각합니다. 프로젝트 규모가 커지고 복잡도가 증가할 때는 물론이지만 반대로 처음 접하는 API의 경우 타입 정보가 없다면 파악하는데 훨씬 많은 시간이 걸리기도 합니다.

물론 파이썬의 경우 선택적으로 타입 힌트를 제공하기도 하고 클래스나 메서드 같은 경우 IDE가 어느 정도 자동 완성의 도움을 주기도 합니다.

하지만 경우에 따라서(예컨대 인자값) API가 명시적인 타이핑을 사용하지 않았다면 그런 도움을 받을 수 없는 경우가 많고, 리팩터링시 버그를 유발하는 원인이 되기도 합니다.

저는 최대한 타이핑 힌트를 활용해서 제가 작성하는 공개 API의 힌트를 넣고 있긴 한데, 스칼라 같이 매우 강력한 타입 시스템을 자랑하는 언어를 쓰다 보니, 특히 파이썬의 제너릭 시스템 같은 건 솔직히 괴랄하고 무척 불편했습니다.

타입 힌트를 넣다가 실수를 해도 멀쩡하게 코드가 돌아간다는 건, 특히 복잡한 프로젝트에선 결코 장점이 될 수 없습니다.

또 한가지 마음에 들지 않는 건, 의외로 함수형에 대한 배려가 부족하더군요. 그 보수적이라는 자바도 옵션형을 제공하는 마당에 파이썬의 경우 언어에서 비슷한 기능을 제공하지 않음은 물론 아직 쓸만한 오픈소스 대안도 찾지 못했습니다.

그나마 자바나 스칼라와 달리 C#과 같은 제너레이터(예컨대, 'yield') 함수를 제공한다는 건 평가할 만하긴 했습니다. 람다식에 대한 문법이 특별히 번잡한 건 이런 문제와 맞물려서 더 불편하게 느껴지더군요.

마지막으로 기본적으로는 인터프리터 방식의 언어다 보니 클래스나 함수의 선언 순서에 영향을 받는 경우가 있다는 점도 꽤 불편했습니다. 예컨대 타입 힌트를 사용할 때 자신과 동일한 유형을 API에 반환형이나 인자로 명시하려면 꼼수가 필요하다거나, import 순서에 따라 코드가 돌아가거나 망가질 수 있다는 점 등은 단점이라고 느꼈습니다.

그 밖에 파이썬에서 특이하게 느꼈던 점은 '클래스 메서드'의 존재인데, 나름 쓰고는 있지만 아직은 '다르다'이외에 다른 언어에 비해 특별히 좋거나 나쁘다고 느끼진 못했습니다. 아, 하긴 클래스 속성을 정의한다거나 할 때 같은 클래스 메서드를 써야하는데 안되서 풀 네임을 붙여야 한다던지 소소하게 불편한 점을 겪긴 했네요.

파이썬 언어를 잠깐 써보면서 느낀 장단점은 이 정도인데, 이 중에서 어디까지가 진짜 파이썬의 특징이고 어디서부터 제 경험 부족으로 인한 편견인지 모르겠습니다.

한 일 년 정도 써보면 아마 보다 객관적인 평가를 내릴 수 있지 않을까 싶습니다. 지금 시점에서 드는 생각은 "자바스크립트를 쓸만한 작업엔 대신 쓰고 싶은 언어"라는 정도입니다. 대략 'JavaScript on steroids' 정도 느낌이랄까요...


덧글 : 이번에도 등록 버튼을 누르니 홀랑 날아가 버렸습니다. 파이썬과 무슨 악연이 있는 것인지... 다행히 누르기 전 뭔가 쎄한 기분이 들어 복사를 해놓아서 복구했습니다. 그런데 간단하게 적겠다고 했는데 쓰고 보니 나름 장문의 글이 되었군요.

10
6
  • 댓글 16

  • 하마
    6k
    2020-07-12 12:20:56 작성 2020-07-16 09:11:38 수정됨

    list comprehension 매력에 빠지면 못나옵니다. ㅎㅎ
    덕분에 데이터 조작,분석,가시화에 가장 선호하는 언어에요.

  • fender
    19k
    2020-07-12 12:27:53 작성 2020-07-12 19:38:58 수정됨

    방금 만들고 있던 오픈소스 프로젝트를 공개했습니다. 아직 POC 단계라 예제도 없고 설명도 없지만 관련 글을 쓴 김에 미리 올려 봅니다:


    혹시 파이썬스럽지 않은 내용이나 오류가 있다면 지적해주시면 감사드리겠습니다.

  • request
    32
    2020-07-12 20:04:34

    코드 잘 보았습니다. 




    타입힌팅이 아직 익숙치 않은 것처럼 보입니다.


    틀린 부분이 약간 보이고, 일관되게 적용되지 않아 아쉬운 부분이 있습니다.


    함수 파라미터 만큼은 모두 타입힌팅을 적용하는게 어떤가 합니다.




    그리고 파이썬은 EAFP 스타일을 권장합니다.


    가령, functions 모듈의 observe 함수를 보면, LBYL 스타일로 적용되어 있습니다.


    파이썬스럽게 작성해보시려면 EAFP 스타일로 적용해보시길 권유드립니다.




    마지막으로 오픈소스라면 black 과 같은 엄격한 포매터를 적용하여, 일관된 코드를 추구하는 것도 좋아보입니다.




    코드의 의도를 알기 어려운 부분이 많아 섣불리 고치긴 어렵지만,


    잘못된 타입힌팅이나 간단한 버그 픽스 정도라도 기여를 하고 싶다면 PR을 드리면 되나요?

  • fender
    19k
    2020-07-12 20:37:26 작성 2020-07-12 20:39:23 수정됨

    request // 

    LBYL vs EAFP는 저도 고민 중이긴 한데, "로마에선 로마법을 따르라" 정도로 생각이 기울긴 하네요. 지금은 제가 봐도 좀 중간 어디 쯤 같은 느낌이 있습니다. 일단 입력 값 검증, assert라도 일관되게 넣어 놓고 다시 한 번 고민해보겠습니다.

    코드 포맷은 파이참에서 시키는 대로 하긴 했는데, black도 한 번 살펴보겠습니다.

    타입 힌트는 넣는다고 넣었는데 오류가 많나보네요. 코드 리뷰, PR 모두 적극 환영합니다 감사합니다 :)

  • fender
    19k
    2020-07-12 20:56:34 작성 2020-07-12 21:00:25 수정됨

    여담이지만, 스칼라에서 넘어와서 그런지 본문에도 언급한 옵션 유형의 부재가 아직 크게 미련이 남습니다.

    EAFP에 대한 부분은 저도 문서 훑어 보면서 흥미롭게 읽은 내용이긴 한데, 그럼에도 마음 한 구석에 뭔가 석연찮은 점이 걸리더군요.

    다른 언어에서 성능 등의 이유로 예외로 흐름제어를 하는 걸 권장하지 않는 건 해당 언어들의 구현 특성이라 치더라도, 과연 대상이 되는 코드에서 예외를 발생 시키는 것이 반드시 검사 대상 값의 부재라고 장담할 수 있는지가 의문이긴 합니다.

    예외 자체도 EAFP로 접근시 코드에 따라 KeyError, AttributeError, TypeError 등 다양한 유형이 발생할 수 있는데, 복수의 예외가 발생 가능할 때 일일이 나열하기도 번거롭지만 (예컨대 obj.attr[key]의 참조), 만일 try 내부의 다른 부분에서 다른 이유로 같은 오류를 발생시킬 때 EAFP 때문에 문제가 가려진다면 그게 좋은 접근인지에 대해 확신이 없는 상황입니다.

    아마 마음에 드는 옵션 유형 라이브러리를 찾았다면 고민없이 LBYL이나 EAFP 둘 다 버리고 그냥 애초에 예외가 발생할 원인을 차단해 버렸을 듯 합니다.

    조만간에 다시 한 번 오픈소스 대안이 있는지 확인해보고 '로마법'을 따를지 여부를 다시 고민해볼까 싶습니다.

  • fender
    19k
    2020-07-12 22:08:53

    언급한 문제와 관련해서 시험 삼아 returns를 적용해봤습니다. 찾아본 비슷한 부류 라이브러리 중엔 가장 활발하게 개발 중인 것 같아 골랐습니다.

  • 코딩요정바람돌이
    -1k
    2020-07-14 04:48:56

    좋은 글이네요~ㅎ

    글 중간중간에 색상으로 잘 표현된 파이썬 소스코드가

    한두줄씩 있다면 더욱 좋았겠습니다~

  • fender
    19k
    2020-07-14 11:46:23 작성 2020-07-14 13:16:14 수정됨

    mypy를 도입해서 타입 오류를 절반 쯤 줄였습니다. 남은 절반은... 뭔가 언어와 싸우는 느낌이... -ㅅ-


    이건 아침에 겪은 문제인데, 보시다시피 파이참이 틀린 코드라고 오류를 표시했습니다. 그런데 mypy는 맞는 코드라고 하고 실제로도 잘 돌아갑니다.

    여기까지만 하면 파이참의 버그겠거니 하면 될 건데, 바로 아래엔 반대로 파이참은 잘 인식하는데 mypy가 타입 추론을 실패하는 코드가 있습니다. 물론 역시 실행하면 잘 돌아갑니다.

    다른 곳에선 이런 오류도 있군요: "Incompatible types in assignment (expression has type "T", variable has type "T")" ...T가 필요해서 T를 넣었더니 T라서 안된다면 어쩌란 건지 -ㅅ-

    농담 반으로 이야기하는 것이지만 동적 타이핑은 사회악이 맞는 것 같습니다.

    덧글: 지금보니 단순히 오류를 잘못 보고하는게 아니라, 저 코드 때문에 파이참 코드 분석기가 무한루프에 빠져서 망가져 버렸습니다. 이래저래 좀 그렇네요.

  • shaffron
    4k
    2020-07-14 13:30:30

    런타임에서 타입 체킹을 할 수 있는 typeguard 란 라이브러리가 있습니다.

    컴파일 시점에 타입 체킹을 하는 여타 언어와 비교하기엔 한참 부족하나.. 아쉬운대로 쓸만합니다

  • Frudy
    6k
    2020-07-14 23:37:42

    역시 실력이 좋으신분은 똑같이 배우기시작해도 결과가 다르다는걸 느낍니다.


    전 파이썬에 대해 아는게 1도없는데

    처음부터 파이썬 공부하기시작해서

    지금의 fender님만큼 파이썬을 이해하려면 얼마나 걸릴까요? ㅎㅎㅎ ㅠㅠ


    노하우 공유해주시는거 감사하게 보고있습니다.


  • fender
    19k
    2020-07-15 09:00:24

    하마 // 그래도 가끔은 스칼라가 그립더군요 ㅎㅎ;

    shaffron // 추천 감사합니다. 지금 당장은 필요한게 IDE 연동 가능한 컴파일 타임에 실행되는 타입 검증 도구라서 어떻게든 mypy로 갈 수 밖에 없을 것 같습니다.

    Frudy // 장문으로 글을 쓰긴 했지만 아직 파이썬에 대해 아는 건 별로 없습니다 ㅎㅎ; Frudy님은 처음 오키 등장하셨을 때부터 금방 실력이 느실 것 같았는데 요즘 글 쓰시는 걸 보면 제 예상이 틀리지 않아서 기쁘네요.

    ......

    일단 타입 오류들은 절반은 해결하고 절반은 우격 다짐으로 처리(e.g. 타입 추론이 가능해야 하는데 굳이 명시하기, # type: ignore로 막기)했습니다.

    PyCharm과 returns 쪽에 각각 이슈 보고 했으니 조만간 개선이 되길 기대하면서 기다리는 수 밖에 없네요.

  • fender
    19k
    2020-07-15 15:50:46

    returns 이슈엔 답이 왔는데 파이썬 람다는 기본적으로 타입 지원을 안하는 모양이군요... 매번 "lambda" 치는 것만해도 좀 아니다 싶었는데 생각보다 부실한 구석도 많은 모양입니다.

    다행히 같은 프로젝트 개발자가 람다를 강타입으로 간결하게 쓸 수 있는 프로젝트도 만든 모양이니 써봐야겠습니다.

  • Frudy
    6k
    2020-07-15 19:15:30

    말씀이라도 감사합니다..!

  • fender
    19k
    2020-07-16 14:05:04

    파이참 문제는 알려진 이슈더군요. 리뷰 단계에 있는 걸 보니 다음 버전에서 고쳐질 것 같습니다. 람다에 대한 타입 검증은... 그냥 포기하면 편한 듯 -ㅅ-

  • 24_26
    858
    2020-07-16 15:04:19

    함수형 프로그래밍할때 불편하다고 생각했는데 저만느낀게 아니었네요

  • 화장실만가면오리무중
    313
    2020-07-22 13:39:24

    좋은글 감사합니다

  • 로그인을 하시면 댓글 을 등록할 수 있습니다.