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 댓 글 에 참고 할 수 있 는 예제 가 있 습 니 다.물론 가장 좋 은 방법 은 이런 디자인 을 피 하 는 것 이다.그러면 자 료 를 찾 는 데 그렇게 오래 걸 리 지 않 을 것 이 고 본문 과 비슷 한 글 을 쓰 는 데 그렇게 오래 걸 리 지 않 을 것 이다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.