Найти - Пользователи
Полная версия: Красивое решение модификация locals()?
Начало » Python для новичков » Красивое решение модификация locals()?
1
doza_and
Может предложите красивое решение?

В некоторой функции ведутся расчеты, параметры хранятся в конфиг файле
Набор инструкций в виде:
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 взять и начать ковырять стек чтобы добраться до локальных переменных вызывающей функции, но мне кажется это уже залезание в дебри.

reclosedev
А окружение доверенное? Тогда может 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 не засорять?
doza_and
Локальные нужны чтобы не namespace не засорять. Переменные а не словарик чтобы короче писать формулы. Окружение доверенное. Перед exec можно сделать проверку или пускать в песочнице, поэтому доверенность не так существенна.
reclosedev
В любом случае неявные переменные возможно будут смущать. Может как компромисс написать обертку ConfigParser с __getattr__(), или хранить конфигурацию в Python модулях/классах?
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