Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для экспертов
  • » Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно? [RSS Feed]

#1 Авг. 18, 2019 19:26:32

MLM
Зарегистрирован: 2012-12-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?

Да, так работает. Для Вас, похоже, нет невыполнимых задач!

 #!/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”. Благодарю Вас за настойчивость.

Офлайн

#2 Авг. 18, 2019 20:07:58

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

Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?

MLM
а создали в локальной области другую с таким-же именем и значением
А что по вашему значит “легализовать”? Код на питоне ищет переменные в locals() потом в globals() ну и т.д. Никакой операции “легализации” в питоне нет. А та это переменная или новая вы можете понять распечатав id. Если переменная изменяемая то вы получите один и тотже id те ваше утверждение о создании новой переменной скорее всего неверно. Проверьте.

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



Офлайн

#3 Авг. 19, 2019 09:00:06

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?

Привет! Я вставлю тут свои пять копеек.

В своём проекте мы храним некоторые куски кода (обычно небольшие) в базе данных, и в нужный момент запускаем через exec. И для себя решили не заморачиваться с locals() и globals() для передачи результатов (хотя входные данные через globals() передаём), а делать так:
Перед запуском exec создаётся пустой словарь results, и все результаты работы этого exec складываются в него под разными ключами. При выходе из exec в основной программе читаем содержимое словаря.



Офлайн

#4 Авг. 20, 2019 12:49:58

MLM
Зарегистрирован: 2012-12-06
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?

> P.S. Никогда не используй exec.
Использую “asteval”

Офлайн

  • Начало
  • » Python для экспертов
  • » Переменная, созданная в "exec", недоступна после "exec", хотя присутствует в locals(), vars() и dir(). Легализовать переменную Возможно?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version