Форум сайта python.su
Да, так работает. Для Вас, похоже, нет невыполнимых задач!
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def check_test(): print('a = 5') a = 5 s = {'a': a} exec(''' print(' Внутри "exec"') print('a = 4') a = 4 print('b = 3') b = 3 print('a ->', a) print('b ->', b) ''', {}, s) print(' После "exec"') print('s ->', s) print('a ->', a) b = s.get('b') print('b ->', b) check_test()
a = 5
Внутри "exec"
a = 4
b = 3
a -> 4
b -> 3
После "exec"
s -> {'a': 4, 'b': 3}
a -> 5
b -> 3
Офлайн
MLMА что по вашему значит “легализовать”? Код на питоне ищет переменные в locals() потом в globals() ну и т.д. Никакой операции “легализации” в питоне нет. А та это переменная или новая вы можете понять распечатав id. Если переменная изменяемая то вы получите один и тотже id те ваше утверждение о создании новой переменной скорее всего неверно. Проверьте.
а создали в локальной области другую с таким-же именем и значением
Офлайн
Привет! Я вставлю тут свои пять копеек.
В своём проекте мы храним некоторые куски кода (обычно небольшие) в базе данных, и в нужный момент запускаем через exec. И для себя решили не заморачиваться с locals() и globals() для передачи результатов (хотя входные данные через globals() передаём), а делать так:
Перед запуском exec создаётся пустой словарь results, и все результаты работы этого exec складываются в него под разными ключами. При выходе из exec в основной программе читаем содержимое словаря.
Офлайн
> P.S. Никогда не используй exec.
Использую “asteval”
Офлайн