2013-05-15 5 views
1

Python 2.7은 패키지 내에서 가져 오기위한 두드러진 모습을 볼 때 매우 특이한 것을합니다. 기본적으로, 그것은 내가 진정으로 이해할 수없는 이유 때문에 내장 된 것들의 상대적인 수입을 저장하고있다. 최소 유스 케이스가 아래에 있습니다. 기괴한 파이썬 수입 문제 - Builtins의 상대적 수입?

는 형태로 디렉토리 구조를 가정 :

\BaseFolder 
    * __init__.py 
    * MainFile.py 
    \TestFolder 
     * __init__.py 
     * TestModule.py 

두 __init__.py가 비어 있습니다. MainFile.py는 말한다 : 파이썬은 당신에게 수입 모듈의 목록을 제공과 함께 MainFile.py 실행

import os 

:

import TestFolder.TestModule 
import sys 
for x in sorted(sys.modules.keys()): 
    print x 

TestModule.py 말한다. 당신이 모듈에 대한 키를 통해 볼 때,이 쓰레기의 무리입니다,하지만 당신은 다음 키를 찾을 수 있습니다

TestFolder 
TestFolder.TestModule 
TestFolder.os 
... 
os 

당신이 그 모듈에 대한 값을 보면, TestFolder.os은 None입니다. 그러나 그것은 왜 처음부터 존재합니까? 왜 모듈리스트가 그것을 찾았을 때 존재하지 않는 것으로 입증 된 모듈을 등록합니까? 나는 시스템이 TestFolder에서 먼저 "os"라이브러리 (즉, TestFolder.os)를 확인한 다음 내장 함수를 조사하기 때문에이 문제가 발생한다고 가정합니다. 왜 당신이 체크했기 때문에 항목을 추가 하는가? 파이썬이 왜 이렇게 할 것인가에 대해 누구나 통찰력을 가지고 있습니까? 어쩌면 그냥 그 위치에있는 도서관을 다시는 확인하지 않겠습니까?

+0

상대 모듈 인 'TestFolder.os'가 존재하지 않는다는 것을 보여주는 센티넬입니다. 이렇게하면 이후에 수입을 더 빠르게 할 수 있습니다. 이것은 속임수 문제입니다. 곧 원본을 찾을 것입니다. –

+0

나는 그것이 진술되었으므로 더미 모듈 문제의 중복 증상과 같은 것으로 동의합니다. 투표하기로 결정했다. – Namey

답변

1

캐시에는 적중 횟수와 누적 수가 포함됩니다. TestFolder.os == None은 파이썬이 "os"라는 패키지 - 관련 모듈을 찾고, 찾지 못했고, 라인을 따라 내려 갔다는 것을 의미합니다. 패키지 절대 이름 "TestFolder.os"는 다른 모듈이이를 호출하기 때문에 캐시합니다. 이 값을 None으로 설정하면 다른 모듈의 가져 오기가 파일 시스템을 다시 확인할 필요가 없습니다.

+0

그건 내가 생각하고 있던 것입니다. 내 질문의 뿌리는 sys.modules가 히트와 미스 모두 결과를 기록하는 캐시가 아니라 모듈의 실제 목록이라는 오해였습니다. – Namey

+0

그러나 공정하게, 관련된 파이썬 문서는 끔찍합니다 : "모듈 이름을 이미로드 된 모듈에 매핑하는 사전입니다"(http://docs.python.org/2/library/sys. html). 시스템이로드하려고 시도한 모듈의 캐시라고 부를 수 있다면 (정상적인 해상도 순서를 사용하여) 일부 헤드 쉐이더는 피할 수 있습니다. – Namey

+0

@Namey - 사실, 실험을하고 가장자리 조건이 올라간다는 것은 모두 파이썬으로 게임의 일부입니다! – tdelaney