python

    [Anaconda] 아나콘다 환경 export, import, clone 하기

    [Anaconda] 아나콘다 환경 export, import, clone 하기

    Introduction 기존에 사용하고 있던 아나콘다 가상환경을 다른 머신에서도 사용하고 싶다던가, 혹은 기존의 가상환경 위에서 새 패키지를 테스트 해 보고 싶은데 디펜던시가 꼬일 가능성이 커 안전하게 별도의 동일한 가상환경을 만들어 쓰고 싶을 때가 있다. 패키지가 몇 개 안 깔려 있는 가상환경인 경우엔 그냥 별도의 가상환경을 똑같이 만들고 필요한 패키지들을 다시 설치해 주면 되지만, 이 작업을 여러 번 수행해야 한다던가 필요한 패키지의 수가 많은 경우 이런 방식에는 한계가 있다. 다행히도 아나콘다에서는 이런 작업을 편하게 하기 위한 몇 가지 기능들을 제공하고 있다. 1. Export conda environment 아나콘다에서는 현재 가상환경을 yaml 파일 형태로 export 하는 것이 가능하다. c..

    [Python] Pythonic 이란?

    [Python] Pythonic 이란?

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

    [Utilities] 학습 프로세스 종료 시 알림 받기

    [Utilities] 학습 프로세스 종료 시 알림 받기

    Introduction 이런 적이 있다. 며칠이 걸리는 학습 프로세스를 급하게 켜 놓고 금요일에 퇴근했는데, 월요일에 와서 보니 시작 직후 사소한 버그로 인해 학습 프로세스가 중단된 것이다. 월요일에 모델 학습을 완료하고 다른 작업을 진행하려 했지만, 금요일에 학습 프로세스가 중단된 것을 알지 못해 다시 며칠 동안 학습을 진행시켜야 했다. 크나큰 자원의 낭비라 할 수 있다. 물론 주말 동안 한 번이라도 터미널에 접속해 봤어도 이를 알 수 있었을 테지만 주말동안 '굳이' VPN을 켜고 원격 접속을 해 터미널을 열어 학습 진행 상황을 확인해 보는 것은 적지 않은 의지를 필요로 한다. 가만.. 그러고 보니 학습 프로세스에 문제가 생겼을 때에 이메일이나 슬랙, 팀즈 등을 통해 알림을 받을 수 있다면 좋지 않을까..

    [Python] Multi-line string Cheet Sheet

    [Python] Multi-line string Cheet Sheet

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

    [OpenCV] TypeError: Expected cv::UMat for argument

    [OpenCV] TypeError: Expected cv::UMat for argument

    Introduction Python에서 OpenCV를 이용하다 보면 아래와 같은 에러 메시지를 분명히 본 적이 있을 것이다. TypeError: Expected cv::UMat for argument [...] TypeError: Expected Ptr for argument [...] 벌써부터 화가 난다... 말해주는 바는 명확하다. argument 뒤에 오는 인자의 타입으로 cv::UMat을 기대했지만 실제로는 아니라는 것이다. 하지만 우리가 일반적으로 파이썬 버전의 OpenCV에서 사용하는 데이터 타입은 numpy.ndarray 이다. 이 시점부터 혼란이 시작된다. numpy.ndarray에 어떤 조건이 더 걸려야 cv::UMat으로 타입 인식이 되는 걸까? 조건을 잘 만족시킨 것 같은데 왜 계속 ..

    [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를 명시적으로 상속시..