프로그래밍파이썬 개발자

파이썬에서 네임스페이스와 모듈 구성의 특징에 대해 설명해 주세요. 임포트는 어떻게 작동하며 큰 프로젝트에서 이름 충돌을 피하는 방법은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

파이썬에서 네임스페이스는 이름과 객체가 연결된 사전입니다. 네임스페이스의 수준: 로컬, 글로벌, 내장. 모듈은 코드를 구성하는 별도의 공간입니다. 임포트할 때 파이썬은 각 모듈에 대해 새로운 네임스페이스를 생성합니다.

임포트 작업

  • import module — 모듈을 임포트하고 module.name을 통해 객체에 접근합니다.
  • from module import name — 모듈에서 현재 네임스페이스로 직접 객체를 임포트합니다 (이름 충돌의 위험이 있습니다).
  • as — 별칭을 지정할 수 있습니다.

이름 충돌을 피하기 위해:

  • 모듈을 명시적으로 임포트 하세요(import mymodule), 별표 (from... import *)를 사용하지 마세요.
  • 패키지를 사용하여 프로젝트를 조직하세요( __init__.py가 있는 디렉터리).
  • 고유하고 의미 있는 이름을 사용하세요;
  • 별칭을 적용하세요(import module as m).

구조 예시

project/
  package/
    __init__.py
    module1.py
    module2.py
import package.module1 from package.module2 import function as fn

함정 질문.

질문: 모듈을 두 번 임포트하는 것은 무엇이 다른가요? 모듈 코드가 다시 실행되나요?

답변: 아닙니다. 처음 임포트할 때 모듈이 실행되고 결과가 sys.modules에 캐시됩니다. 반복 임포트는 이미 로드된 모듈 객체를 반환하고 코드가 다시 실행되지 않습니다.

# module.py print('Hello!') # main.py import module # Hello! 출력 import module # 아무 것도 출력되지 않음

주제의 세부사항 부족으로 인한 실제 오류 사례.


이야기

개발자들이 여러 모듈에서 from settings import *를 사용하여 설정 변경 시 예상치 못하게 "로컬 변수"가 "덮어쓰기" 되는 바람에 해결하기 어려운 버그가 발생했습니다.

이야기

대규모 프로젝트에서 서로 다른 팀들이 같은 이름의 모듈 (예: utils.py)을 생성했습니다. 통합 단계에서 "같은" 이름의 모듈이 서로 "대체"되어 예상치 못한 동작과 복잡한 버그가 발생했습니다.

이야기

어떤 라이브러리에서 importlib.reload를 통해 새로운 설정으로 모듈을 "시스템적으로 다시 임포트"하려 했습니다. 그러나 이미 임포트된 다른 모듈이 객체에 대한 구형 링크를 유지하고 있어 변경 사항이 애플리케이션의 모든 부분에서 적용되지 않았습니다.