Механизм импорта Python и макеты модулейPython

Программы на Python
Ответить
Anonymous
 Механизм импорта Python и макеты модулей

Сообщение Anonymous »

Это скорее попытка понять, как работает Python (в данном случае 3.9), чем попытка решить реальную проблему, поэтому, пожалуйста, потерпите меня и не обращайте внимания на бессмысленный способ m3. Я просто хотел повторить то, с чем имею дело.
У меня следующая структура:

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

├── m1.py
└── m2
└── m3
├── __init__.py
└── m3.py
m2/m3/__init__.py:

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

from .m3 import *
m2/m3/m3.py:

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

def m3func():
print('m3 func is here')
С этого момента я буду вносить изменения в m1.py.
Это работает, и я ожидал, что это сработает:

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

import m2.m3
m2.m3.m3func()
Это не ошибка, поэтому он заменил модуль Mock. Я тоже ожидал, что это сработает именно так.

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

import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
import m2.m3 as alias
alias.m3func()
То же самое

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

import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
from m2 import m3
m3.m3func()
Я не понимаю, что здесь происходит:

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

import sys
from unittest.mock import Mock
sys.modules['m2.m3'] = Mock()
import m2.m3
m2.m3.m3func()

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

m2.m3.m3func()
AttributeError: module 'm2' has no attribute 'm3'
Каковы различия между импортом m2.m3, импортом m2 m3 и импортом m2.m3 как псевдонимом
Что еще я не понимаю и есть ли способ исправить последнюю версию, чтобы она не выдавала ошибку AttributeError? В моем примере m2 пуст, но на самом деле я не хочу его полностью заменять, потому что он содержит вещи, которые меня волнуют. Я просто хотел бы настроить таргетинг на m3. Есть ли рекомендация относительно использования такого кода: m2.m3.m3func()?


Подробнее здесь: https://stackoverflow.com/questions/663 ... dule-mocks
Ответить

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

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

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

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

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