У меня есть пакет Python mymodule
с подпакетом utils
(т.е. подкаталог, который содержит модули каждый с функцией). Функции имеют то же имя как файл/модуль, в котором они живут.
Я хотел бы смочь получить доступ к функциям следующим образом,
from mymodule.utils import a_function
Странно однако иногда я могу импортировать функции с помощью вышеупомянутой нотации, однако другие времена, я не могу. Я не смог разработать, почему, хотя (недавно, например, я переименовал функцию и файл, в котором это было и отразилось, это переименовывает в utils.__init__.py
файл, но это больше не импортировало как функции (скорее как модуль) в одном из моих сценариев.
utils.__init__.py
чтения что-то как,
__all__ = ['a_function', 'b_function' ...]
from a_function import a_function
from b_function import b_function
...
mymodule.__init__.py
не имеет никакой ссылки на utils
Идеи?
Нужно ли вашим функциям utils импортировать другие функции utils? (или импортируйте другие модули, которые импортируют другие функции утилит). Предположим, например, что a_function.py содержит "from mymodule.utils import b_function". Вот ваш файл utils.py с кучей дополнительных комментариев:
# interpreter is executing utils.py
# Right now, utils.a_function and utils.b_function are modules
# The following line executes the a_function module,
# then rebinds a_function to a_function.a_function
from a_function import a_function
# The following line executes the b_function module,
# then rebinds b_function to b_function.b_function
from b_function import b_function
Когда модуль a_function впервые импортируется с помощью utils.py, utils.b_function является модулем, а не функцией. Любой модуль, в котором указано «from mymodule.utils import b_function» перед выполнением последней строки, будет содержать ссылку на модуль b_function вместо функции b_function.
В общем, я считаю, что идиома from somemodule import something
чревата опасностями для любого большого проекта. Он отлично подходит для коротких скриптов, но как только вы начнете вводить циклические зависимости импорта, вы столкнетесь с проблемами и должны быть осторожны с тем, где вы его используете.
В качестве компромисса между безопасностью и экономией на вводе я бы использовал из mymodule import utils
, а затем вызвал utils.a_function ()
. Таким образом, вы всегда будете получать объект, привязанный к utils.a_function
прямо сейчас , вместо того, что было привязано к utils.a_function
во время импорта.