Самостоятельный импорт подпакетов или нет? - PullRequest
6 голосов
/ 01 декабря 2009

Предположим, у вас есть следующее

b
b/__init__.py
b/c
b/c/__init__.py
b/c/d
b/c/d/__init__.py

В некоторых пакетах Python, если вы import b, вы получите только символы, определенные в b. Чтобы получить доступ к b.c, вы должны явно import b.c или from b import c. Другими словами, вы должны

import b
import b.c
import b.c.d
print b.c.d

В других случаях я видел автоматический импорт всех подпакетов. Это означает, что следующий код не выдает ошибку

import b
print b.c.d

потому что b/__init__.py заботится об импорте своих подпакетов. Я склонен отдавать предпочтение первому (явно лучше, чем неявному), и я всегда использовал его, но есть ли случаи, когда второй предпочтительнее первого?

Ответы [ 2 ]

5 голосов
/ 01 декабря 2009

Мне нравятся пространства имен - поэтому я думаю, что import b должен получать только то, что находится в b (предположительно в b/__init__.py). Если есть причина отделять другие функции в b.c, b.c.d или чем-то еще, то просто import b не должен перетаскивать все это внутрь - если "перетаскивание всего этого" действительно происходит, я думаю, это говорит о том, что Разделение пространства имен, вероятно, было поддельным для начала. Конечно, есть примеры даже в стандартной библиотеке (import os, тогда вы можете использовать os.path.join и т. П.), Но они древние, к настоящему времени по существу "унаследованные" вещи еще до того, как система упаковки Python стала зрелой и стабильный. В новом коде я бы настоятельно рекомендовал, чтобы пакет не тащил свои подпакеты для поездки, когда вы импортируете их. (Сделайте import this в приглашении Python и подумайте о самой последней строке, которую он показывает; -).

0 голосов
/ 01 декабря 2009

__all__ = [ваши переменные, функции, классы]

Используйте синтаксис выше в пакете b __init__.py для автоматической загрузки вещей, перечисленных в dict. :)

...