Найти - Пользователи
Полная версия: Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?
Начало » Python для экспертов » Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?
1 2
MLM
Да, так работает. Для Вас, похоже, нет невыполнимых задач!
 #!/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
Однако, строго говоря, мы не “легализовали” переменную из “exec”, а создали в локальной области другую с таким-же именем и значением. Почему меня интересует именно возможность или невозможность “легализации” переменных из “exec”? Причина в том, что в общем случае я могу не знать имён переменных, которые будут созданы текстом, переданным в “exec”. Интересует именно возможность или невозможность “легализации” всех переменных, которые будут созданы кодом в “exec”. Благодарю Вас за настойчивость.
doza_and
MLM
а создали в локальной области другую с таким-же именем и значением
А что по вашему значит “легализовать”? Код на питоне ищет переменные в locals() потом в globals() ну и т.д. Никакой операции “легализации” в питоне нет. А та это переменная или новая вы можете понять распечатав id. Если переменная изменяемая то вы получите один и тотже id те ваше утверждение о создании новой переменной скорее всего неверно. Проверьте.

Никто не мешает подсунуть в exec словари и получить списки переменных. Только переносить эти переменные в locals() абсолютно бесполезно в большинстве случаев. Как вы этим собираетесь пользоваться если не знаете заранее имена переменных?
Striver
Привет! Я вставлю тут свои пять копеек.

В своём проекте мы храним некоторые куски кода (обычно небольшие) в базе данных, и в нужный момент запускаем через exec. И для себя решили не заморачиваться с locals() и globals() для передачи результатов (хотя входные данные через globals() передаём), а делать так:
Перед запуском exec создаётся пустой словарь results, и все результаты работы этого exec складываются в него под разными ключами. При выходе из exec в основной программе читаем содержимое словаря.
MLM
> P.S. Никогда не используй exec.
Использую “asteval”
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