Импорт функции/класса от модуля Python того же имени

У меня есть пакет 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

Идеи?

6
задан Brendan 25 March 2010 в 21:24
поделиться

1 ответ

Нужно ли вашим функциям 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 во время импорта.

7
ответ дан 17 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

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