파이썬 모듈 (1) 파이썬 doc 톺아보기 1

Sanghun Moon·2021년 7월 18일
0

python

목록 보기
1/4

처음 장고로 개발을 했을 때, 규모 있는 서비스를 다루면서 많은 고민을 했다.
하나의 파일에서 모든 내용을 다루게 된다면, 나중에 코드의 가독성과 복잡도를 감당할 수가 없게 된다. 여기에 클래스 상속까지 꼬이게 된다면, 계속 이를 신경 쓰게 되어 어려움을 겪었던 경험이 있다.

그러다가 '클린 코드'를 강조한 사수분께서 전반적인 서비스를 리팩토링하면서 새로운 directory structure 를 보게 됐는데, 정말로 신세계였다. 어떤 패턴이라고 하는지는 기억이 안나지만 action 을 따로 빼서, API 의 입출력을 다루는 부분, 함수 단위의 로직을 다루는 부분, DB 를 다루는 DAO 부분으로 나눴다. 이렇게 함으로서 코드를 추가하거나 수정을 할 때, 전체적인 구조를 한번 생각하고 적절한 곳에 추가를 하게 되어 코드를 작성하는 일에만 집중할 수 있어서 좋았다.

서론이 길었는데, 이러한 모듈화, 리팩토링, 아키텍처에 관심이 많았으면서도 막상 파이썬 모듈에 대해서 완벽하게 알고 있는 것 같지 않아서

  • 파이썬 공식 문서
  • 그리고 얄팍한 나의 경험

을 기반으로 파이썬 모듈에 대해서 설명하려고 한다.

파이썬 공식 문서는 스크립트부터 이야기가 시작된다

스크립트

좀 긴 프로그램을 쓰고자 할 때, 인터프리터 입력을 편집기를 사용해서 준비한 후에 그 파일을 입력으로 사용해서 실행

프로그램이 길어짐에 따라, 유지를 쉽게 하려고 여러 개의 파일로 나누고 싶을 때가 있다

→ 여러 프로그램에서 썼던 편리한 함수를 각 프로그램에 정의를 복사하지 않고도 사용하고 싶을 때

모듈

이런 것을 지원하기 위해, 파이썬은 정의들을 파일에 넣고 스크립트나 인터프리터의 대화형 모드에서 사용할 수 있는 방법 제공

모듈은 파이썬 정의와 문장들을 담고 있는 파일이다

  • 모듈의 이름은 전역 변수 __name__ 으로 제공
  • 함수를 자주 사용할 거라면 지역 이름으로 대입할 수 있다

모듈 tips

  • 모듈은 함수 정의뿐만 아니라 실행 가능한 문장들도 포함할 수 있다

  • 이 문자들은 모듈을 초기화하는데 사용

  • 이것들은 import 문에서 모듈 이름이 처음 등장할 때만 실행된다

  • 각 모듈은 자신만의 symbol table 을 갖고 있는데, 그 모듈에서 정의된 함수들의 전역 symbol table 로 사용된다

  • 그래서, 모듈의 저자는 사용자의 전역 변수와 우연히 충돌할 것을 걱정하지 않고 전역 변수를 사용할 수 있다

from fibo import *
fib(500)
  • 모듈이 정의하는 모든 이름 을 임포트하는 형태도 존재
  • 밑줄(_) 로 시작하는 것을 제외한 모든 이름을 import
  • 모듈이나 패키지에서 *를 import 하지 말자 (읽기에 편하지 않은 코드를 만들기 때문)

-> 이 말은 즉슨

모듈을 스크립트로 실행하기

python fibo.py <arguments>
  • 모듈에 있는 코드는 그것을 import 할 때처럼 실행

    (__name__"__main__" 로 설정)

  • 이 코드를 모듈의 끝에 붙여서

if __name__ == "__main__":
	import sys
	fib(int(sys.argv[1]))
  • 파일을 import 할 수 있는 모듈뿐만 아니라, 스크립트로도 사용할 수 있도록 만들 수 있음을 의미

  • 오직 모듈이 "main" 파일로 실행될 때만 명령행을 파싱하는 코드가 실행

  • import 했을 때 본문의 내용이 실행되는 경우

    '''
    Fibonacci numbers module
    '''
    
    a = 3
    b = 4
    _a = 4
    print("hello world")
    
    def fib(n):
        a, b = 0, 1
        while a < n:
            print(a, end=' ')
            a, b = b, a+b
        print()
    
    def fib2(n):
        result = []
        a, b = 0, 1
        while a < n:
            result.append(a)
            a, b = b, a+b
        return result

  • 이것은 종종 모듈에 대한 편리한 사용자 인터페이스를 제공하거나 테스트 목적으로 사용

모듈 검색 경로

  • spam 이라는 이름의 모듈이 import 될 경우, 인터프리터는 먼저 그 이름의 내장 모듈을 찾는다
  • 발견되지 않으면, 변수 sys.path 로 주어지는 디렉토리들에서 spam.py 라는 이름의 파일을 찾고, sys.path 는 이 위치들로 초기화된다

sys.path 는 이 위치들로 초기화된다

  • 입력 스크립트를 포함하는 디렉토리 (파일이 지정되지 않았을 때는 현재 디렉토리)
  • PYTHONPATH
  • 설치 의존적인 기본값

초기화 이후에, 파이썬 프로그램은 sys.path 를 수정할 수 있다

스크립트를 포함하는 디렉토리는 검색 경로의 처음에, 표준 라이브러리 경로의 앞에 놓인다

이는 같은 이름일 경우 라이브러리 디렉토리에 있는 것 대신 스크립트를 포함하는 디렉토리의 것이 로드된다는 뜻

sys.path 는 인터프리터의 모듈 검색 경로를 결정하는 문자열들의 리스트

환경변수 PYTHONPATH 에서 취한 기본 경로나, PYTHONPATH 가 설정되지 않는 경우 내장 기본값으로 초기화

import sys
sys.path.append('/ufs/guido/lib/python')

dir() 함수

내장 함수 dir() 은 모듈이 정의하는 이름들을 찾는 데 사용

문자열들의 정렬된 리스트를 반환

마무리

dir() 메소드는 라이브러리의 객체에 대한 정보를 얻으려고 할 때 간간이 사용한 적이 있다
다음에는 패키지 이후의 내용에 대해서 다룰 예정이다

profile
Python Server Developer

0개의 댓글