Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 29, 2010 22:25:26

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Отключить кеширование кода

Ситуация:
1. Запускаем интерпритатор и вводим

from mylib import MYCONST
print MYCONST
2. Изменяем ручками значение MYCONST и сохраняем файл с ним
3. В том же окне интерпретатора что и в пункте 1 снова вводим
from mylib import MYCONST
print MYCONST
А теперь проблема: оба раза при печати MYCONST выводится ее начальное значение (на момент первого импорта данной константы)
А нужно, чтобы каждый раз при импорте значение считывалось заново.

PS
да, я понимаю что такой механизм снизит производительность, но мне важно добиться именно такого поведения интерпретатора



Офлайн

#2 Окт. 30, 2010 00:06:27

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Отключить кеширование кода

import module
reload(module)



Офлайн

#3 Окт. 30, 2010 08:22:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Отключить кеширование кода

Уверен, ваша хотелка уводит в сторону от хорошего решения.
Если нужно исполнять код каждый раз - используйте execfile. Ему можно передавать globals/locals.
В подавляющем большинстве случаев realod не нужен. Я видел относительно немного исключений.



Офлайн

#4 Окт. 30, 2010 09:29:46

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Отключить кеширование кода

reload это уже близко к истине.
чуть больше предистории: это нужно при работе веб-приложения. апач стартует интерпретатор. в ответ на некоторые действия пользователя перезаписывается файл с настройками. нужно после его изменения заставить все модули, которые его импортируют заново импортировать значения настроек, а не брать из кеша.
отсюда вопрос: если я после изменения запущу reload(settings) - это заставит всех прочитать новые настройки? //сорри за глупый вопрос, который могу проверить сам, просто не скоро попаду к рабочей машине



Офлайн

#5 Окт. 30, 2010 11:02:36

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Отключить кеширование кода

DelphinCoder
если я после изменения запущу reload(settings) - это заставит всех прочитать новые настройки?
Нет.
DelphinCoder
в ответ на некоторые действия пользователя перезаписывается файл с настройками. нужно после его изменения заставить все модули, которые его импортируют заново импортировать значения настроек, а не брать из кеша.
Вы не должны этого хотеть.

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



Офлайн

#6 Окт. 30, 2010 11:45:22

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Отключить кеширование кода

Daevaorn
DelphinCoder
если я после изменения запущу reload(settings) - это заставит всех прочитать новые настройки?
Вы решаете не ту проблему. Держите настройки не в исходном коде, а где-то где вы можете их изменять и при этом читать каждый раз актуальное значение.
Спасибо за совет, но задача стоит именно так, как я ее описал.
Если кто знает как этот “кеш” сбросить глобально для текущего инстанса питона - подскажите плиз



Офлайн

#7 Окт. 30, 2010 12:13:06

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Отключить кеширование кода

DelphinCoder
Спасибо за совет, но задача стоит именно так, как я ее описал.
Хороший повод поменять её стояние.



Офлайн

#8 Окт. 30, 2010 13:30:52

DelphinCoder
От:
Зарегистрирован: 2009-05-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Отключить кеширование кода

я бы с радостью, но поменять никак нельзя. в будущем эта задача выльется в систему кодогенерации.
вот сгенерировали мы код, а чтобы его интерпретатор воспринял нужно его перезапустить - а вот это как раз и не есть гут.
т.ч. давайте без углубления в архитектуру программных систем и анализа правильности постановки задачи.
реализуема ли задача кодогенерации на питоне без перезапуска интерпретатора? или питон для этого не подходит и писать такие вещи лучше на так ненавистном мне php???



Офлайн

#9 Окт. 30, 2010 18:58:59

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

Отключить кеширование кода

Да, реализуема. Но подход неправильный – ищите другое решение или пишите на пиашпи.



Офлайн

#10 Окт. 30, 2010 19:56:16

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Отключить кеширование кода

в твистеде есть релоадер ( twisted.python ), думаю стоит глянуть его исходники, если привязать к изменению файла - будет вполне неплохо



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version