2011-12-17 4 views
5

파이썬 패키지의 서브 모듈을 포함하는 디렉토리 (서브 패키지)가 패키지를 가져올 때 기호로 나타나는 이유는 무엇입니까? 나는이 패키지가있는 경우 예를 들어, :파이썬 가져 오기 패키지 - 서브 패키지가 기호 테이블에 나타나서는 안됩니다

PyModTest/      Top-level package 
      __init__.py    Initialize the package 
      Source/     Subpackage holding source files 
       __init__.py 
       WildMod.py  Submodule containing a function: 'WildFunc' 

를 최상위 __init__.py은 다음과 같다 여기서

#!/usr/bin/env python 

from Source.WildMod import WildFunc 

하고, 완전성 '을 위해, 낮은 수준의 __init__.py은 다음과 같습니다 :

#!/usr/bin/env python 

__all__ = ["WildMod"] 

OK, 내가 통역을 열어 이제 모듈을 가져온 기호를 보면 :

>>> import PyModTest 
>>> dir(PyModTest) 
['Source', 'WildFunc', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 

'가져 오기'기능을 사용하지 않아도 '소스'모듈이 표시됩니다.

내가보고 싶은 유일한 기호는 내 'WildFunc'입니다. 'Source'패키지를 숨길 방법이 있습니까? 여기에서 주목해야 할

답변

6

두 가지 : 파이썬에서

  • 이 모듈은 실제 객체, 그들의 이름 사이에 나타나는 점은 Source를 의미, 당신은 상대 가져 오기를하고있는
  • 실제 속성 액세스를 나타냅니다 PyModTest.Source.WildMod.WildFunc을 가져 오려면, 파이썬은

    에있다 : 그래서 실제로 PyModTest.Source (이 지적 TokenMacGuy 덕분에)

입니다

  • 검사를 (이미에 의해 수행되었다)하고 Source이라는 속성을 가지고 있는지, 그렇지 않은 경우, PyModTest/Source/__init__.py
  • 검사에서 그것을 가져 와서 속성을 작성하고이이 있는지
    1. 수입 PyModTest 속성은 WildMod라고, 그렇지 않은 경우, PyModTest/Source/WildMod.py
    2. 검사에서 그것을 가져 와서 속성을 작성하고 (이것은 않습니다) WildFunc라는 속성
    가 있는지 확인3210

    일부 관련 세부 사항은 PEP 302Python language reference에서 논의됩니다.

    메커니즘이 깊어 질수록 점으로 구분 된 이름 가져 오기가 구성 요소로 나뉩니다. "import spam.ham"의 경우 먼저 "import spam"은 이고 성공한 경우에만 "ham"이 서브 모듈로 가져 오기 이 "spam"입니다.

    당신이 Source라는 이름의 변수를 갖고 싶어하지 않을 경우

    , 그것은 쉽게 고칠 수있다 : 당신이 기능을 가져 단지 del Source 후. 그러나 나중에 실행되는 코드가 PyModTest.Source.<anything>에 액세스하지 못하도록한다는 점을 명심하십시오 (참조를 저장 했으므로 WildFunc 제외).나는 확실히 Source에 대한 참조를 무시하고 삭제하는 것이 아니라, 아무 것도 아프지 않기 때문에 제안 할 것입니다.

  • +0

    굉장합니다. '델 소스'에 대한 제안을 주셔서 감사합니다 :) – rokuingh

    +2

    '소스'는'PyModTest'의 서브 패키지이고, 암시 적 임포트는 조용히'PyModTest.Source import ... '로 변형되므로'Source' 모듈은 'PyModTest' 모듈의 속성으로 추가 될 수 있습니다. 'Source '가'PyModTest' 패키지 외부에서 발견 되었다면 (아마, 하위 패키지가'sys.path'보다 우선합니다.), 이것은 발생하지 않았을 것입니다. 자신과 타인을 혼란스럽게하는 것을 피하기 위해 항상 절대 수입을 선호합니다. – SingleNegationElimination

    +0

    @TokenMacGuy : 아, 잘 잡으세요. 어쨌든 이것은 상대적 수입이라는 사실을 놓쳤습니다. –

    관련 문제