Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 3, 2013 15:21:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Красивое решение модификация locals()?

Может предложите красивое решение?

В некоторой функции ведутся расчеты, параметры хранятся в конфиг файле
Набор инструкций в виде:

def Mf():
    cfg=ConfigParser.ConfigParser()
    cfg.read(filename)
    a=cfg.getint("somesection","a")
    b=cfg.getint("somesection","b")
.................................................
    z=cfg.getfloat("somesection","z")
Считаю уродским, поскольку:
1 имена переменных заданы в 3 местах (в конфиге и две позиции в коде)
2 многократно повторяется “somesection” по смыслу в данной функции читается одна секция конфига - зачем повторять…
3 приходится отслеживать тип переменной, хотя по тексту в конфиге можно вывести тип.

Хочется сделать так:
def Mf():
    insert_vars_from_config(filename,"somesection",globals())
и функция insert_vars_from_config делает чтение анализ и имплантирование переменных.
Но это засорение пространства имен модуля. locals() не проходит…, можно inspect взять и начать ковырять стек чтобы добраться до локальных переменных вызывающей функции, но мне кажется это уже залезание в дебри.



Отредактировано doza_and (Апрель 3, 2013 15:32:08)

Офлайн

#2 Апрель 3, 2013 17:56:24

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Красивое решение модификация locals()?

А окружение доверенное? Тогда может exec?

code = """
a = 1
b = 2
c = 3
"""
def mf():
    exec code in locals()
    print a
mf()  # 1
print a  # NameError
upd
Оказывается, не все так просто
code = """
a = 1
b = 2
c = 3
"""
def mf():
    a = 2
    exec code in locals()
    print a
mf()  # 2
http://stackoverflow.com/questions/1463306/how-does-exec-work-with-locals

Вам именно локальные нужны, для скорости? Или чтобы namespace не засорять?

Отредактировано reclosedev (Апрель 3, 2013 18:08:07)

Офлайн

#3 Апрель 3, 2013 19:49:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Красивое решение модификация locals()?

Локальные нужны чтобы не namespace не засорять. Переменные а не словарик чтобы короче писать формулы. Окружение доверенное. Перед exec можно сделать проверку или пускать в песочнице, поэтому доверенность не так существенна.



Отредактировано doza_and (Апрель 3, 2013 19:52:50)

Офлайн

#4 Апрель 3, 2013 20:40:24

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Красивое решение модификация locals()?

В любом случае неявные переменные возможно будут смущать. Может как компромисс написать обертку ConfigParser с __getattr__(), или хранить конфигурацию в Python модулях/классах?

Отредактировано reclosedev (Апрель 3, 2013 20:41:54)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version