[python] 올바른 / 올바른 패키지 __init__.py 파일을 작성하는 방법

내 패키지의 구조는 다음과 같습니다.

mobilescouter/
    __init__.py #1
    mapper/
        __init__.py  #2
        lxml/
            __init__.py #3
            vehiclemapper.py
            vehiclefeaturemapper.py
            vehiclefeaturesetmapper.py
        ...
        basemapper.py
   vehicle/
        __init__.py #4
        vehicle.py
        vehiclefeature.py
        vehiclefeaturemapper.py
   ...

__init__.py파일을 올바르게 작성 하는 방법을 잘 모르겠습니다 . 외모가 좋아 :
__init__.py #1

__all__ = ['mapper', 'vehicle']
import mapper
import vehicle

그러나 예를 들어 어떻게 보 __init__.py #2일까요? 광산은 :

__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml

언제 사용해야 __all__합니까?



답변

__all__매우 좋습니다-모듈을 자동으로 가져 오지 않고 가져 오기 명령문을 안내하는 데 도움이됩니다.
http://docs.python.org/tutorial/modules.html#importing-from-a-package

사용 __all__import *중복, __all__필요한 것만

내가 사용하는 가장 강력한 이유 중 하나라고 생각 import *에서 __init__.py수입 패키지에 대한 기존의 응용 프로그램을 깨지 않고 여러 스크립트로 성장했습니다 스크립트를 리팩토링 할 수있을 것입니다. 그러나 처음부터 패키지를 디자인하는 경우. __init__.py파일을 비워 두는 것이 가장 좋습니다 .

예를 들면 다음과 같습니다.

foo.py - contains classes related to foo such as fooFactory, tallFoo, shortFoo

그런 다음 앱이 커지고 이제는 전체 폴더입니다.

foo/
    __init__.py
    foofactories.py
    tallFoos.py
    shortfoos.py
    mediumfoos.py
    santaslittlehelperfoo.py
    superawsomefoo.py
    anotherfoo.py

초기화 스크립트는

__all__ = ['foofactories', 'tallFoos', 'shortfoos', 'medumfoos',
           'santaslittlehelperfoo', 'superawsomefoo', 'anotherfoo']
# deprecated to keep older scripts who import this from breaking
from foo.foofactories import fooFactory
from foo.tallfoos import tallFoo
from foo.shortfoos import shortFoo

변경 중에 다음을 수행하도록 작성된 스크립트가 중단되지 않도록합니다.

from foo import fooFactory, tallFoo, shortFoo


답변

내 자신의 __init__.py파일이 비어있는 경우가 더 많습니다. 특히, 나는이 결코 from blah import *의 일환으로 __init__.py-, 등의 기능을 직접 정의 된 패키지의 한 부분으로, 그때의 내용을 복사 어휘 것이다 클래스의 모든 종류를 얻는 수단 “패키지 가져 오기”경우 blah.py패키지에있어 __init__.py대신 및 제거 blah.py( 소스 파일의 곱셈은 여기서 좋지 않습니다).

import *관용구 (eek) 를지지한다고 주장한다면 , __all__(자신이 가지고있는 이름의 목록을 미니어처로) 사용 하면 손해 관리에 도움이 될 수 있습니다. 일반적으로 네임 스페이스와 명시 적 가져 오기는 좋은 것이며, 개념 중 하나 또는 둘 다를 우회하여 체계적으로 우회하는 방법을 다시 고려할 것을 강력히 권장합니다!-)


답변

귀하는 __init__.py해야 문서화 문자열을 .

모든 기능이 모듈 및 하위 패키지에 구현되어 있지만 패키지 docstring은 시작 위치를 문서화하는 장소입니다. 예를 들어, python emailpackage를 고려하십시오 . 패키지 문서는 목적, 배경 및 패키지 내의 다양한 구성 요소가 함께 작동하는 방법을 설명하는 소개입니다. 스핑크스 또는 다른 패키지를 사용하여 문서 문자열에서 문서를 자동으로 생성하는 경우 문서 docstring은 이러한 소개를 설명하는 데 가장 적합한 곳입니다.

다른 내용은 firecrowAlex Martelli 의 탁월한 답변을 참조하십시오 .


답변