Как я пишу хороший/корректный пакет __ 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__ б/У?

179
задан schmi 29 April 2014 в 08:54
поделиться

2 ответа

__all__ очень хорошо - помогает направлять операции импорта без автоматического импорта модулей. http://docs.python.org/tutorial/modules.html#importing-from-a-package

используя __all__ и импорт * является избыточным, нужен только __all__

я думаю, что одна из самых весомых причин использовать импорт * в __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

тогда init-скрипт может сказать

__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
141
ответ дан 23 November 2019 в 20:13
поделиться

Мои собственные __init__.py файлы чаще пустые, чем нет. В частности, у меня никогда не было из blah import * как части __init__.py -- если "импорт пакета" означает получение всех видов классов, функций и т.д., определенных непосредственно как часть пакета, то я бы лексически скопировал содержимое blah.py в __init__ пакета. py вместо этого и удалить blah.py (умножение исходных файлов здесь бесполезно).

Если вы настаиваете на поддержке импорта * идиом (eek), то использование __all__ (с таким миниатюрным списком имён, как вы можете себе представить) может помочь в борьбе с повреждениями. В общем, пространства имен и явный импорт являются хорошими вещами, и я настоятельно рекомендую пересмотреть любой подход, основанный на систематическом обходе одного или обоих понятий!-)

.
109
ответ дан 23 November 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: