Найти - Пользователи
Полная версия: Передать данные из импортируемого модуля в импортирующий
Начало » Python для новичков » Передать данные из импортируемого модуля в импортирующий
1 2
ZZZ
Мне было лень писать пример… :-)
Но я бы за такое руки отрывал. По самые гланды.
py.user.next
ZZZ
Мне было лень писать пример
Не, там имеется в виду, что функция осталась функцией, а модулем не стала. По идее, если вызов модуля допускается, то должен быть синтаксис, который делает модуль вызываемым, навроде __call__ у класса.
ZZZ
Ну так класс с __call__ туда и положить. Не? Можно даже унаследоваться от types.ModuleType.
py.user.next
>>> import types
>>> 
>>> class A(types.ModuleType):
...     def __call__(self):
...         print(self)
... 
>>> import sys
>>> 
>>> sys.modules['x'] = A('x name')
>>> 
>>> import x
>>> 
>>> x()
<module 'x name'>
>>>

ZZZ
Можно даже унаследоваться от types.ModuleType.

Ну да, походу, это так и делается. Простую функцию туда записывать - как-то не то.
ZZZ
py.user.next
Простую функцию туда записывать - как-то не то.
Если ты не питон-гуру с, хотя бы, пятилетним опытом разработки, лучше туда вообще ничего руками не писать. Эти хаки потом дорого выходят тем, кто пытается их поддерживать.
py.user.next
ZZZ
лучше туда вообще ничего руками не писать
Не, там есть случаи, когда такое надо.
Например, какое-нибудь дерево проекта с какой-нибудь системой импортирования. То есть такое импортирование, что в него особо не залезешь, а нужно что-нибудь проанализировать. Подделать модуль, чтобы программа думала, что он настоящий.

Сейчас вот тестирую прогу свою. Она использует функции из os.path для проверки файлов. Чтобы они отвечали то, что надо, весь os.path заменяется через unittest.mock.patch(). Потом там уже настраиваются ответы. То есть в каких-то тестах файлы делаются несуществующими через ложный os.path.exists(), а в каких-то - существующими.

Но для этого мне пришлось больше месяца читать документацию (ужасно сделана) по мокам. Если бы у меня не было времени читать её, а тестировать надо было бы, то я бы использовал самодельную заглушку. То есть воспроизводил бы модуль в классе вот так, чтобы не затрагивать импорты.

ZZZ
Эти хаки потом дорого выходят
Если нужен модуль, который нужно вызывать, то, скорее всего, что-то просто не продумано.

Главное, что питон и такое даёт вполне прилично реализовать.
ZZZ
Есть, конечно, места, где это нужно. Но в девяносто девяти случаях из ста, если ты думаешь, что оно тебе надо, то скорее всего ты делаешь что-то не так. И это надо вбивать в голову новичкам, а то потом с этим адом приходится разбираться.

py.user.next
мне пришлось больше месяца читать документацию (ужасно сделана) по мокам
Как я тебя понимаю… Обнять и плакать, да…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB