7강 - 모듈, 패키지, 이름공간, 스코프

Han Hanju·2022년 4월 7일
0
post-thumbnail

7.1.모듈

  • 스크립트: 소스코드를 파일에 기술하여 반복 실행을 지원
  • 모듈: 다른파일에서 정의한 클래스나 함수

파이썬에서 모듈과 스크립트의 명확한 차이는 없음

1. 모듈작성

  • str을 base64로 변환하는 모듈
  • 위 모듈은 base64 모듈을 읽어드린다. (모듈 import)

2. 모듈 임포트

  • 모듈을 읽어들이는 행위
  • encoder: module 클래스의 인스턴스
  • 모듈안에 정의된 함수 호출

3. python3 명령어로 직접 실행하기

  • 인수얻기

    • 변환 대상 문자열을 커맨드라인 인수로 보낼 수 있다.
    • 스크립트로는 문제 없으나 대화형모드에서 모듈로는 사용 불가능
      • 인수를 전달이 안되기 때문 (sys.argv[]에서 에러)
  • 직접 실행할 때만 동작하는 코드

    • 대화형에서도 에러가 없다
  • if__name__='__main__' 블록의 의미

    • 어떤 모듈이 python3명령어에 전달되면 해당 모듈 안의 변수 __name__의 값은 문자열 __main__이된다.
  • 변수 __name__에 저장되는값

7.2 패키지-모듈의 집합

  • 패키지: 여러 모듈을 모으는 기능
    • 모듈/ 서브패키지를 모아둔 디렉터리
    • 패키지임을 표시하기위해 __init__.py 파일을 배치
    • 규모가 커지더라도 유지보수성을 지킬 수 있다.

1. 패키지 작성

  • 패키지 객체는 모듈 객체와 거의 같지만 __path__속성을 가지고있다는 차이가 있다.
  • encoder.py를 b64 패키지 하위에 이동
  • decoder.py를 만들고 b64 패키지 하위에 이동

2. 패키지 안에 있는 모듈 임포트

  • __init__.py - 패키지 초기화 수행

    • 코드추가
    • import 할때 실행됨
  • __init__.py의 편리한 사용법

    • {패키지 이름}.{속성 이름}으로 참조 할수 있는 API를 만든다고 해 보자
      • 현재 에러
      • __init__.py 변경
        • 속성이 추가되었다.

3. import문 비교

  • import 문만을 이용한 임포트

  • from 절을 이용한 특정 속성 임포트

    • 패키지나 모듈에서 특정 속성을 직접 임포트
    • 패키지 안의 모듈을 임포트
    • 점으로 서브패키지나 모듈지정
  • .을 이용한 상대 임포트

    • 점한개: 현재 두개: 이전
  • 와일드카드 문자를 이용한 여러 속성 일괄 임포트

  • __all__을 사용하여 공개할 모듈만 사용 가능

  • as절을 사용한 별명 부여

    • ex) import pandas as pd

7.3 임포트의 구조

1. 모듈 검색 흐름

  • 표준라이브러리 검색 -> sys.path의 경로 목록 차례로 검색 -> 발견 못할시 ModuleNotFoundError 발생

2. sys.path-모듈 검색 경로

맨앞이 빈문자라면 현재 디렉터리, 이후 목록 차례로 검색

스크립트 파일과 같은 디렉터리가 가장 먼저 검색

  • 검색 경로의 우선순위

3. PYTHONPATH - sys.path에 검색 경로를 추가

  • PYTHONPATH 환경변수 추가시 sys.path에 자동추가
  • 원하는 scope를 정할 수 있음

7.4 이름 공간과 변수의 스코프

1. 이름공간 - 이름과 객체의 매핑

  • 이름 공간 활용
    • 이름과 객체의 맵핑
    • os.open(), gizp.open()은 함수명은 같으나 다른 이름공간에 들어있어 다르게 실행된다.

2. 스코프 - 직접 접근할 수 있는 영역

이름검색은 좁은스코프에서 넓은스코프로 순서대로 일어나며 가장 먼저 발견한 이름의 객체를 참조

  • 로컬 스코프 - 함수 안에 국한된 스코프

    • locals()로 로컬변수 확인
  • 전역 스코프 - 모듈 최상위 레벨의 스코프

    • globals()로 글로벌변수 확인
    • 전역변수 값을 덮어쓰고싶을때는 global문 이용
  • 빌트인 스코프 - 내장 객체의 스코프

  • 인클로징 스코프 - 현재로컬 스코프의 1계층 바깥쪽의 스코프

    • 안에 정의된 함수가 아닌 인클로징 스코프의 변수 사용시 nonlocal 사용
  • 클로저 - 작성시 환경을 기억하는 함수 객체

    • 함수객체의 한 종류
    • 자신이 만들어졌을때의 환경에 있는 변수에 대한 참조를 유지
      • 서로다른 클로저는 서로 영향을 주지 않음
profile
Data Analytics Engineer

0개의 댓글