Python 에서 모듈 과 가방 의 이름 이 같은 처리 방법

4389 단어 python모듈싸다.
머리말
프로 그래 밍 개발 에 서 는 개인 적 으로 규범 에 따라 하기 만 하면 문제 가 거의 없다 고 생각한다.처음 기술 을 배 웠 을 때 는 확실히 많은 구 덩이 를 만 났 다.밟 은 구덩이 가 많아 지면 좋 은 일이 고 더 많은 것 을 배 울 수 있 으 며 규범 에 따라 하 는 중요성 도 점점 느 낄 것 이다.규범 의 제정 은 바로 문 제 를 회피 하 는 것 이다.어떤 때 는 확실히 경험 이 있 는 사람의 건 의 를 들 어야 지,자기 고집 대로 해 서 는 안 된다.이것 은 본문의 중점 이 아 닌 것 같 습 니 다.사실은 제 중점 은 표현 하고 자 하 는 것 입 니 다.가능 한 한 규범 에 따라 일 을 하면 많은 시행 착 오 를 덜 걸 을 수 있 습 니 다.
제 가 현재 사용 하고 있 는 주력 프로 그래 밍 언어 는 Python 입 니 다.Python 을 접 한 후에 지금까지 제 가 밟 은 구덩이 가 매우 적 고 이상 한 문제 가 거의 없 는 것 같 습 니 다.사실 이것 은 결코 좋 은 일이 아니다.구 덩이 를 밟 지 않 고 어두 운 곳 에 누 워 있 는 많은 지식 을 알 지 못 하기 때문에 성장 하기 도 어렵다.다행히 구 덩이 를 밟 을 줄 아 는 동료 들 이 있 었 다.
한 동료 가 Python 에서 하나의 모듈 이 하나의 가방 과 같은 이름 일 때 가방 만 가 져 올 수 있 는 것 이 아니 냐 고 물 었 습 니 다.모듈 을 가 져 오 려 면 어떻게 해 야 합 니까?그의 뜻 은 대략 이렇다.프로젝트 의 같은 단계 디 렉 터 리 아래 에 foo.py 파일 과 foo/디 렉 터 리 가 있다.import foo 가 foo.py 가 아 닌 foo/내용 을 가 져 올 것 이다.
이 문 제 를 물 었 을 때,내 가 먼저 느 낀 것 은 의아 함 이 었 다.이것 은 분명히 나 쁜 뜻 이 있 었 다.나 같 으 면 모듈 이름과 가방 이름 을 같은 이름 으로 만 들 지 않 았 을 것 이다.본질 적 으로 가 져 올 때 누 구 를 가 져 올 지 구분 할 수 없 기 때문이다.시스템 에 특별한 규정 이 있 는 경 우 를 제외 하고 이 경우 가방 만 가 져 올 수 있 도록 규정 하고 있다.
나 는 잠재의식 적 으로 여기에 잘못 보고 해 야 한다 고 생각 했다.Python 해석 기 는 누 구 를 가 져 올 지 몰 랐 다.그러나 동료 들 은 다른 사람의 코드 가 이렇게 쓰 여 있 고 이런 상황 에서 가방 을 가 져 오 는 것 을 기본 으로 한다 고 말 했다.그것 은 가능 합 니 다.그리고 해석 기 는 항상 가방 을 가 져 올 것 이 라 고 규정 하고 있 습 니 다.
이 점 을 검증 하기 위해 저 는 간단 한 프로젝트 를 썼 습 니 다.프로젝트 구 조 는 다음 과 같 습 니 다.

.
├── main.py
└── same
 ├── api
 │ └── __init__.py
 ├── auth
 │ └── __init__.py
 ├── auth.py
 └── __init__.py
그 중:
same/api/__init__/py 의 내용:

from .. import auth
same/auth/__init__.py 의 내용:

auth_str = "This is str in package!"
same/auth.py 의 내용:

auth_str = "This is str in module!"
main.py 의 내용:

from __future__ import print_function

from same.api import auth

# Script starts from here

if __name__ == "__main__":
 print(auth.auth_str)
조금 복잡 합 니 다.하하,주로 동료 들 에 게 대체적인 구 조 는 이 렇 습 니 다.여 기 는 더 좋 은 시 뮬 레이 션 을 위 한 것 입 니 다.나 는same.auth 가방 에서auth_str문자열 을 정 의 했 고 같은 이름 의same.auth모듈 에서 같은 이름 의auth_str문자열 을 정의 했다.그리고 same.api 가방 에서 auth 를 가 져 오 려 고 시도 했다.마지막 으로 main.py 에서 출력 same.api.auth.auth_str을 시도 했다.어떤 문자열 이 인쇄 되 는 지 보 자.동시에 Python 2 와 Python 3 으로 main.py 를 실행 하려 고 시도 한 결과 모두:

This is str in package!
여기 서 우리 의 추측 이 정확 하 다 는 것 을 검증 하 였 으 며,해석 기 는 확실히 가방 의 내용 만 가 져 왔 다.그러나 공식 적 인 자료 설명 이 이런 것 인지 아 닌 지 는 모 르 겠 기 때문에 만약 이것 이 우연 일 뿐 이 라 고 확신 할 수 없다.
그래서 나 는 자 료 를 찾 아 이 결론 을 검증 하기 시작 했다.나 는 솔직히 말 하 겠 다.네가 상상 할 수 없 을 정도 로 영어 수준 이 나 쁜 나 에 게 먼저 바 이 두 로 답 을 검색 해 볼 수 밖 에 없다.사실은 바 이 두 를 사용 하 는 것 은 종종 유감 이다.잠시 후,성과 가 없어 서,나 는 억지로 영어 검색 을 시도 할 수 밖 에 없 었 다.그래서 stackoverflow 에서 다음 과 같은 질문 을 찾 았 습 니 다.
How python deals with module and package having the same name?
그 중 한 명 은 Python 공식 문서 에서 모듈 검색 경 로 를 설명 할 때 이 점 을 언급 했다 고 대답 했다.https://docs.python.org/3/tutorial/modules.html#the-module-search-path
문서 에 다음 과 같은 설명 이 있 습 니 다.
After initialization, Python programs can modify sys.path. The directory containing the script being run is placed at the beginning of the search path, ahead of the standard library path. This means that scripts in that directory will be loaded instead of modules of the same name in the library directory. This is an error unless the replacement is intended. See section Standard Modules for more information.
디 렉 터 리 가 라 이브 러 리 검색 경로 에서 먼저 검색 된다 는 것 은 같은 이름 의 모듈 대신 디 렉 터 리 가 불 러 온 다 는 뜻 이다.
이제 야 안심 이 되 었 다.이전의 결론 이 실증 되 었 다.Python 에서 같은 이름 의 모듈 과 가방 을 가 져 오 려 고 시도 하면 가방 이 가 져 옵 니 다.이 경우 모듈 을 가 져 오 려 면'hack'방법 을 사용 해 야 할 것 같 습 니 다.위 에서 언급 한 stackoverflow 댓 글 에 참고 할 수 있 는 예제 가 있 습 니 다.물론 가장 좋 은 방법 은 이런 디자인 을 피 하 는 것 이다.그러면 자 료 를 찾 는 데 그렇게 오래 걸 리 지 않 을 것 이 고 본문 과 비슷 한 글 을 쓰 는 데 그렇게 오래 걸 리 지 않 을 것 이다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기