Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 30, 2014 23:05:47

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Передать данные из импортируемого модуля в импортирующий

Мне было лень писать пример… :-)
Но я бы за такое руки отрывал. По самые гланды.



Офлайн

#2 Окт. 1, 2014 00:22:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Передать данные из импортируемого модуля в импортирующий

ZZZ
Мне было лень писать пример
Не, там имеется в виду, что функция осталась функцией, а модулем не стала. По идее, если вызов модуля допускается, то должен быть синтаксис, который делает модуль вызываемым, навроде __call__ у класса.



Отредактировано py.user.next (Окт. 1, 2014 00:23:36)

Офлайн

#3 Окт. 1, 2014 09:13:28

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Передать данные из импортируемого модуля в импортирующий

Ну так класс с __call__ туда и положить. Не? Можно даже унаследоваться от types.ModuleType.



Офлайн

#4 Окт. 1, 2014 10:39:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Передать данные из импортируемого модуля в импортирующий

>>> 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.

Ну да, походу, это так и делается. Простую функцию туда записывать - как-то не то.



Офлайн

#5 Окт. 1, 2014 15:05:31

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Передать данные из импортируемого модуля в импортирующий

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



Офлайн

#6 Окт. 2, 2014 00:39:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Передать данные из импортируемого модуля в импортирующий

ZZZ
лучше туда вообще ничего руками не писать
Не, там есть случаи, когда такое надо.
Например, какое-нибудь дерево проекта с какой-нибудь системой импортирования. То есть такое импортирование, что в него особо не залезешь, а нужно что-нибудь проанализировать. Подделать модуль, чтобы программа думала, что он настоящий.

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

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

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

Главное, что питон и такое даёт вполне прилично реализовать.



Офлайн

#7 Окт. 2, 2014 10:01:46

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Передать данные из импортируемого модуля в импортирующий

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

py.user.next
мне пришлось больше месяца читать документацию (ужасно сделана) по мокам
Как я тебя понимаю… Обнять и плакать, да…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version