Найти - Пользователи
Полная версия: Сгенерировать новые переменные
Начало » Python для новичков » Сгенерировать новые переменные
1 2
ofigetitelno
:)
Это была цитата из документации…
Т.е. оно работает в интерпретаторе, а в коде:
def f():
a = 'zzz'
locals()[a] = 'xxx'
print(a)
f()
а не поменяется…
exec активно используют в базаре, и довольны…
crchemist
Ок, справді. визнаю свою помилку. дивився як працює locals():
def locals():
import sys
frame = sys._getframe()
return frame.f_locals
В той час як інтерпретатор бере змінні певно з co_varnames:
>>> def f():
... a = 'zzz'
... locals()[a] = 'xxx'
... print a
...
>>> f.func_code.co_varnames
('a',)
>>> import dis
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('zzz')
3 STORE_FAST 0 (a)
...
4 19 LOAD_FAST 0 (a)
22 PRINT_ITEM
Чи я помиляюсь?
ZZZ
Я вот только одного не понимаю – на кой хер это надо, когда можно создать словарь. Или класс для этих целей организовать. ИМХО, “динамические переменнве”, это хороший пример плохого кода.
crchemist
вирішив з тим розібратись до кінця:
Подивився на LOAD_FAST:
case LOAD_FAST:
x = GETLOCAL(oparg);
if (x != NULL) {
Py_INCREF(x);
PUSH(x);
goto fast_next_opcode;
}
format_exc_check_arg(PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg));
break;
Потім на GETLOCAL:
#define GETLOCAL(i)<--->(fastlocals[i])
fastlocals = f->f_localsplus;
typedef struct _frame {
...
PyObject *f_localsplus[1];<>/* locals+stack, dynamically sized */
} PyFrameObject;
Ніфіга з того не зрозумів і подивився на STORE_FAST:
case STORE_FAST:
v = POP();
SETLOCAL(oparg, v);
goto fast_next_opcode;
#define SETLOCAL(i, value)    do { PyObject *tmp = GETLOCAL(i); \
GETLOCAL(i) = value; \
Py_XDECREF(tmp); } while (0)
З того всього получається що змінні зберігаються не в frame.f_locals а в f_localsplus, який недоступний з пітона
crchemist
ZZZ
ИМХО, “динамические переменнве”, это хороший пример плохого кода.
Деколи такі речі необхідні. знаю 3 таких приклади - py_zipimport.py (сам гвідо його написав;) ) І для відкладених імпортів - zope.deferredimport i підозрюю що і bzr.lazy_import так працює. Також приклад є в старих версіях PloneTestCase (хоча там думаю можна було обійтись без того)
pythonwin
ZZZ
ИМХО, “динамические переменнве”, это хороший пример плохого кода.
согласен!
+ использование exec небезопастно и трудно читать такой код
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