Programming/Python

    [Python] Pythonic 이란?

    [Python] Pythonic 이란?

    Introduction Pythonic 한 코드란 무엇일까? 본인은 pythonic 한 코드란 파이썬의 특징적인 기능들을 잘 살리면서 파이썬의 철학에 맞게 작성한 코드라고 두루뭉술하게 알고 있었고, 이전 포스트에서도 굉장히 여러 번 pythonic이란 단어를 언급했었다. 하지만 막상 pythonic 하다는 것이 정확히 어떤 것을 뜻하는지 인지하고 있나 생각 해 보니, 그렇지 않다는 것을 깨달았다. 따라서 이번 포스팅에서는 Pythonic 한 코드에 대해서 알아보도록 하겠다. What is Pythonic? Pythonic 하다는 표현에 대한 설명은 꽤나 다양한 버전이 존재한다. 1. 파이썬 언어의 특징적인 기능들을 이용해 보기 좋은 / 명확한 / 유지보수가 쉬운 코드를 작성하는 것, 2. 파이썬 커뮤니티..

    [Python] Multi-line string Cheet Sheet

    [Python] Multi-line string Cheet Sheet

    Introduction 가끔 그럴 때가 있다. 95자나 105자 같이 PEP 8 규약 (참고) 혹은 팀에서 정해놓은 한 줄 길이 제한에 맞추어 코드를 작성해야 하는데, 어떻게 작성하려 해도 explainability를 유지한 채로 한 줄에 다 못 넣겠는 경우가 있다. 특히 베이스로 들어가 있는 인덴트 (하나당 네 칸을 잡아먹는다) 갯수가 많을 수록 문제는 심각해진다. 일반적인 코드야 새 변수를 선언하고 괄호로 예쁘게 묶고 하는 식으로 무조건 해결할 수 있는 편인데, 뭔가 에러를 raise 하면서 같이 출력해야 하는 에러 메시지 처럼 긴 스트링을 작성해야 하는 경우엔 도통 어떻게 잘라서 줄나눔을 해야 하는지 굉장히 헷갈리는 경우가 많다. assert isinstance(dataset, ConcatDatas..

    [Python] importlib과 모듈 리로드

    [Python] importlib과 모듈 리로드

    Introduction Jupyter notebook과 같은 대화형 개발 도구를 이용해 프로토타이핑을 하다 보면, 이미 임포트 해둔 모듈의 내용을 수정하고 싶을 때가 많다. 단순히 해당 임포트 구문을 다시 실행시키면 되지 않을까? >>> import foo_module >>> # foo_module.py의 코드 내용 변경... >>> import foo_module >>> # 변경 사항은 여전히 적용되지 않는다 아쉽게도 이미 한번 임포트 된 모듈은 다시 임포트 구문을 실행시킨다 해도 변경된 내용이 인터프리터 상에 적용되지는 않는다. 물론 노트북 커널이나 인터프리터를 재시작한 후 다시 임포트를 하면 변경 내용을 반영시킬 수 있다. 하지만 다시 실행시켰을 때 코드 테스트 환경을 똑같이 재현하기가 어려운 상황..

    [Python] TypeError: exceptions must derive from BaseException

    [Python] TypeError: exceptions must derive from BaseException

    Introduction 파이썬 개발 중 아주 가끔씩, 다음과 같은 TypeError 메시지를 만나볼 수 있다. TypeError: exceptions must derive from BaseException 뭐가 문제였을까? Solution 정답은 바로 이전 포스트에서도 언급했듯이, 파이썬3 에서는 BaseException 내장 클래스를 상속받는 클래스만이 예외 클래스로 인식되기 때문이다. 따라서 만약 예외 클래스를 인자로 받아야 하는 자리에 예외 클래스로 인식되지 않는 (BaseExeption을 상속받지 않는) 클래스를 적어놓는 경우 위와 같은 에러 메시지를 보게 된다. class FooClass: pass try: raise FooClass() except FooClass: print("Catch!")..

    [Python] 클래스가 object를 상속받는 경우

    [Python] 클래스가 object를 상속받는 경우

    Introduction 남의 파이썬 코드를 보다 보면, 종종 다음과 같은 형태의 클래스 선언과 마주하게 된다. class MyClass(object): # blah blah... 일단은 해당 라인만 보면 내가 선언한 클래스가 object 클래스를 상속 받아서 뭔가를 하고 있는 것처럼 보인다. 하지만 스크롤을 더 내려 봐도 상속을 받아서 따로 하는 것도 없어 보이고, 심지어는 object 상속을 제거해도 코드는 아무런 에러 없이 멀쩡히 돌아간다! 대체 이건 용도가 무엇이며 왜 굳이 넣는 걸까? 결론부터 말하자면, 파이썬 3에서의 object 상속은 표기상의 차이 이외에 상속 관계가 없는 클래스 선언과 아무런 차이점이 없다. 파이썬 2 (정확히는 2.2 이상) 에서는 클래스에 object를 명시적으로 상속시..

    [Python] 프로파일링 (profiling)

    [Python] 프로파일링 (profiling)

    Introduction 파이썬 코드를 작성하다 보면 성능 최적화를 위해 코드의 실행 시간을 정확히 측정하고 싶을 때가 있다. 물론 아래와 같이 time 모듈을 이용해 시간 성능 저하가 예상되는 일부 코드 블럭의 실행 시간을 직접 측정해 볼 수 있지만, 요소별로 실행 시간을 측정하기가 불편하고, 무엇보다도 파이썬의 동적인 특성으로 인해 예상되는 지연 구간과 실제 지연이 일어나는 부분이 다를 수 있다는 문제가 있다. from time import time from math import sin, cos, pi def projectile_landing_position(velocity, angle, g_constant): """ XY평면 (0,0) 좌표에서 X축 기준 angle(deg,

    [Python] 파이썬 3.10 기능 소개

    [Python] 파이썬 3.10 기능 소개

    Introduction 최근에 파이썬 3.10 업데이트 관련 소식이 간간히 들려오는데, 문득 어떤 점이 달라진 건지 궁금해진 차에 한번 관련 내용들을 정리해 보기로 했다. 이번 글에서는 파이썬 3.10의 주요 새 기능들을 간략히 정리할 예정이다. 글의 내용은 Python 3.10 beta 3 (3.10.0b3, 2021년 6월 17일 release) 를 기준으로 한다. 그리고 대부분의 예제 코드는 공식 도큐멘테이션을 참고했다! 맨 아래에 직접 pre-release 를 다운로드 할 수 있는 링크도 남겨두었으니 한번씩 체험해 봐도 좋을 듯 하다. (다음 글) [Python] 파이썬 3.11 기능 소개 1. 타입 힌트 관련 파이썬의 타입 힌트 기능에 관련된 기초적인 내용은 여기를 참고하자. 파이썬 자체는 동적..

    [Python] 파이썬 디버거 (pdb)

    [Python] 파이썬 디버거 (pdb)

    Introduction 내가 작성한 파이썬 코드가 예상하던 대로 작동하지 않거나, 예기치 못한 오류로 자꾸 종료된다면 프로그램 내부의 지역 변수를 들여다 보고 원하는 지점에 원하는 값이 대입되고 있는 지를 한번 확인해 보면 좋을 것이다. 이를 위해서, 간단하게는 print 함수를 써서 확인이 필요한 지점마다 값을 출력하게 해 프로그램 실행 중의 변수를 확인하거나, 조그만 테스트 코드를 작성해 문제가 될 만한 상황을 재현해 볼 수 있다. 하지만 프로그램과 데이터의 규모가 커지고 복잡해질수록, 위와 같은 방법만으로는 문제의 원인을 해결하기가 여전히 어려울 수 있다. 이런 상황에서는 파이썬 디버거 (pdb) 가 유용한 해결책이 될 수 있다. pdb - Python debugger pdb 모듈은 파이썬을 위한 ..