Почему при импорте модуля пакета № 2 из модуля пакета № 1 импортируются все атрибуты модуля № 2 в пространстве имен?Python

Программы на Python
Anonymous
Почему при импорте модуля пакета № 2 из модуля пакета № 1 импортируются все атрибуты модуля № 2 в пространстве имен?

Сообщение Anonymous »

Рассмотрим папку, содержащую простой пакет Python:

Код: Выделить всё

python
├── main.ipynb
├── package
│   ├── __init__.py
│   ├── function.py
│   └── operations.py
├── pyproject.toml
├── README.md
└── uv.lock
где находятся модули в пакете

Код: Выделить всё

# function.py

from package.operations import my_add, my_multiply

def my_function(alpha, beta, x, y):
return my_add(my_multiply(alpha, x), my_multiply(beta, y))
и

Код: Выделить всё

# operations.py

def my_add(x, y):
return x + y

def my_multiply(x, y):
return x * y
Из main.ipynb я запускаю команду импорта

Код: Выделить всё

from package.function import my_function, my_add
Это работает, и my_function и my_add загружаются в пространство имен, хотя my_add определен в Operations.py, а не в function.py.
Почему это происходит и следует ли этого избегать?
Я предполагаю, что это происходит потому, что при импорте package.function импорт выполняется в function.py, которые затем добавляются в пространство имен. Но мне кажется опасным разрешать импорт my_add непосредственно из function.py, потому что он не определен там, где он определен. Похоже, что это частично нарушает защиту от коллизий имен, которую должна обеспечивать модульность.
В любом случае, как лучше всего действовать в такой ситуации?

Вернуться в «Python»