Почему при импорте модуля пакета № 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, потому что он не определен там, где он определен. Похоже, что это частично нарушает защиту от коллизий имен, которую должна обеспечивать модульность.
В любом случае, как лучше всего действовать в такой ситуации?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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