TIL#41 PYTHON 기초(21)

Dasom·2020년 8월 23일
1

python

목록 보기
32/50
post-thumbnail

calculator 패키지 만들기

__init__.py 파일에는 아무코드도 없다. init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.

ㄴ calculator
    ㄴ __init__.py
    ㄴ add_and_multiply.py
    ㄴ multiplication.py
ㄴ main.py
  • main.py
# absolute path
# from calculator.add_and_multiply import add_and_multiply

# relative path
# from .calculator.add_and_multiply import add_and_multiply

if __name__=='__main_':
    print(add_and_multiply(1,2))
  • add_and_multiply.py
from .multiplication import multiply


# from calculator.multiplication import multiply
def add_and_multiply(a, b):
    return multiply(a, b) + (a + b)
  • multiplication.py
def multiply(a, b):
    return (a * b)

main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인 후 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지(파이썬 공식 문서를 참고)

# 에러코드
ImportError: attempted relative import with no known parent package

relative path(상대 경로) 는 모듈 안에서만 사용해야 한다. 일반적으로 local package 안에서 다른 local package를 import 할때 사용된다.

You can also write relative imports, with the from module import name form of import statement. These imports use leading dots to indicate the current and parent packages involved in the relative import. - 파이썬 공식 문서 中..

-> main.py 에서는 absolute path(절대 경로)로 패키지의 모듈을 임포트 해야 한다.

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력

add_and_multiply.py 의 절대경로와 상대경로 모두 정상적으로 출력된다.
add_and_multiply.py 는 패키지 안에 들어있는 모듈이기 때문에 절대경로와 상대경로 모두 실행되며, main.py는 패키지 안에 들어있지 않기 때문에 상대경로는 실행이 안되고 절대경로만 실행이 된다.

init.py 파일의 역할

해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다. python3.3 버전부터는 __init__.py 가 없어도 패키지로 인식한다. 하지만 하위호환을 위해 생성하는 것이 안전하다.

특정 디렉토리의 모듈 전체를 불러 오고 싶을때 * 을 사용하면 오류가 발생한다.

from calculator import *
if __name__ == '__main__':
    print(add_and_multiply(1, 2))

# 실행하면 오류 발생
NameError: name 'add_and_multiply' is not defined

특정 디렉토리의 모듈을 * 을 사용하여 import 할 때는 다음과 같이 해당 디렉토리의 __init__.py__all__ 변수를 설정하여 불러오고 싶은 모듈을 정의해주어야 한다.

# __init__.py
__all__ = ['add_and_multiply']

# * 실행
from calculator import *
if __name__ == '__main__':
    print(add_and_multiply.add_and_multiply(1, 2))

정상적으로 실행된다.

profile
개발자꿈나무🌲

1개의 댓글

comment-user-thumbnail
2021년 10월 11일

공부한 내용과 다른 답들이 많아 혼란스러웠는데 다솜님 정리글 보고
깔끔하게 해당 문제 다시 정리할 수 있었습니다.
감사합니다 :)

답글 달기