프로그래밍/파이썬(Python)

파이선(Python) from import: 심화편

프리다이어비티즈 2024. 10. 15. 09:39

파이썬에서 from ... import ... 구문은 특정 모듈에서 원하는 부분만 가져와 코드를 더 간결하고 효율적으로 작성할 수 있게 해줍니다. 이번 글에서는 기본적인 사용법을 넘어, from ... import ... 구문의 심화된 사용법과 그 활용 전략들을 자세히 살펴보겠습니다.

공지

본 포스팅의 무단도용 및 배포를 금지합니다.

1. 기본적인 from ... import ... 사용법

기본적으로 from ... import ... 구문은 모듈의 특정 함수, 클래스, 변수를 가져오는 데 사용됩니다. 이를 통해 모듈 전체를 가져올 필요 없이 필요한 부분만 가져와 사용할 수 있어 메모리와 가독성 측면에서 유리합니다.

from math import sqrt, pi

print(sqrt(16))  # 4.0
print(pi)  # 3.141592653589793

위 예제에서는 math 모듈에서 sqrt와 pi만 가져왔습니다. 이는 모듈 전체를 가져오는 import math보다 더 간결한 코드 작성을 가능하게 합니다.

 

2. 별칭 사용하기 (as 키워드)

가져온 모듈이나 함수에 별칭(alias)을 붙여 더 간결하게 사용할 수 있습니다. 별칭은 특히 이름이 길거나 자주 사용되는 경우 유용합니다.

from datetime import datetime as dt

now = dt.now()
print(now)  # 현재 날짜와 시간 출력

datetime 모듈의 datetime 클래스를 dt로 줄여 사용함으로써 코드의 가독성을 높였습니다.

 

3. 전체 가져오기 (from module import *)

from ... import * 구문을 사용하면 모듈의 모든 요소를 가져올 수 있습니다. 하지만 이 방식은 권장되지 않습니다. 왜냐하면 네임스페이스 오염의 가능성이 높아져, 코드의 가독성과 유지 보수성이 떨어질 수 있기 때문입니다.

from math import *

print(sin(0))  # 0.0
print(cos(0))  # 1.0

위 예제에서 math 모듈의 모든 요소를 가져왔습니다. 하지만 이 경우 다른 모듈에서 가져온 함수나 변수와 이름이 충돌할 가능성이 있어 문제가 될 수 있습니다. 따라서 이 방법은 피하는 것이 좋습니다.

 

4. 모듈 내부 구조 살펴보기 (dir() 함수)

가져온 모듈의 내부에 어떤 요소들이 있는지 살펴보기 위해 dir() 함수를 사용할 수 있습니다. 이는 모듈에서 필요한 부분을 정확히 가져올 때 유용합니다.

import math

print(dir(math))

이 코드는 math 모듈에 포함된 모든 함수와 변수를 리스트로 반환합니다. 이를 통해 원하는 항목을 선택하여 가져올 수 있습니다.

 

5. 상대 경로 가져오기

패키지 내에서 모듈을 가져올 때 상대 경로를 사용할 수 있습니다. 상대 경로 가져오기는 특히 패키지 구조를 사용할 때 유용합니다.

# 패키지 구조
# my_package/
#     __init__.py
#     module1.py
#     module2.py

# module1.py 내부
from .module2 import some_function

some_function()

위 예제에서 module1은 동일한 패키지 내의 module2에서 some_function을 상대 경로를 사용해 가져옵니다. 점(.)은 현재 패키지를 의미하며, 이를 통해 패키지 내 모듈 간의 상호 참조를 쉽게 할 수 있습니다.

 

6. 네임스페이스 충돌 방지하기

여러 모듈에서 동일한 이름의 함수나 변수를 가져올 때 충돌이 발생할 수 있습니다. 이를 방지하기 위해 별칭을 사용하는 것이 좋은 방법입니다.

from math import pow as math_pow
from numpy import power as numpy_power

print(math_pow(2, 3))  # 8.0 (math 모듈의 pow 함수)
print(numpy_power(2, 3))  # 8 (numpy 모듈의 power 함수)

math 모듈의 pow와 numpy 모듈의 power 함수가 이름이 유사하기 때문에, 각각에 별칭을 붙여 구분했습니다. 이로써 네임스페이스 충돌을 방지하고 코드의 명확성을 높일 수 있습니다.

 

7. 동적 가져오기 (importlib 모듈 사용)

동적 가져오기는 모듈을 코드 실행 중에 동적으로 가져오는 방법입니다. importlib 모듈을 사용하면 이를 쉽게 구현할 수 있습니다.

import importlib

module_name = "math"
math_module = importlib.import_module(module_name)
print(math_module.sqrt(25))  # 5.0

이 방법을 사용하면 모듈 이름을 문자열로 처리할 수 있어, 상황에 따라 가져올 모듈을 동적으로 결정할 수 있습니다. 이는 플러그인 시스템이나 유연한 모듈 로딩이 필요한 경우에 유용합니다.

 

8. 모듈의 일부만 선택적으로 가져오기 (if 조건문 사용)

특정 조건에 따라 모듈의 일부만 가져오고 싶다면 if 조건문을 사용해 코드의 실행 흐름을 조절할 수 있습니다.

import sys

if 'matplotlib' in sys.modules:
    from matplotlib import pyplot as plt
    print("Matplotlib is available and imported.")
else:
    print("Matplotlib is not available.")

이 예제에서는 matplotlib 모듈이 로드되어 있는지 확인한 후, 그에 따라 필요한 부분만 가져옵니다. 이 방법은 코드 실행 시 필요한 모듈만 가져와 메모리 사용을 줄이는 데 유리합니다.

 

9. 사람들이 자주 묻는 질문들

9.1 import와 from ... import ... 중 어느 것을 사용해야 하나요?

일반적으로 모듈 전체를 가져와야 하는 경우 import를 사용하고, 특정 항목만 필요할 때 from ... import ...을 사용하는 것이 좋습니다. 후자는 코드의 가독성을 높이고, 필요 없는 부분을 가져오는 것을 피할 수 있습니다.

9.2 from ... import *는 왜 피해야 하나요?

from ... import *는 네임스페이스를 오염시킬 수 있어 코드 유지보수가 어렵고, 예상치 못한 이름 충돌을 일으킬 수 있습니다. 따라서 명시적으로 필요한 항목만 가져오는 것이 더 좋습니다.

9.3 import ... as ... 구문의 장점은 무엇인가요?

import ... as ...는 긴 이름을 줄여 코드를 더 간결하게 만들고, 네임스페이스 충돌을 방지하는 데 유용합니다. 특히 비슷한 이름을 가진 여러 모듈을 동시에 사용할 때 코드의 명확성을 높일 수 있습니다.

 


from ... import ... 구문은 파이썬에서 모듈과 패키지를 효율적으로 사용하기 위한 강력한 도구입니다. 이 구문의 기본적인 사용법을 넘어, 별칭 사용, 네임스페이스 충돌 방지, 동적 가져오기 등 다양한 심화된 기법을 활용하면 더 효율적이고 가독성 높은 코드를 작성할 수 있습니다. 이번 글이 파이썬의 모듈과 패키지를 사용하는 데 있어 더 깊은 이해를 돕는 계기가 되었길 바랍니다. 추가로 궁금한 점이 있다면 언제든지 문의해주세요.