Как вы можете использовать ключевое слово python exec внутри функций?
Запуск exec внутри функции
comment
Что именно доставляет вам неприятности? что ты уже испробовал?
- person Mark Rushakoff   schedule 13.04.2010
comment
что вы пытаетесь сделать?
- person ghostdog74   schedule 13.04.2010
Ответы (3)
Это повредит производительности вашей функции, а также ее ремонтопригодности, но если вы действительно хотите сделать свой собственный код намного хуже, Python2 (это не будет работать в Python3, вам нужно использовать второй вариант) дает вам «достаточно веревка, чтобы выстрелить себе в ногу" (;-):
>>> def horror():
... exec "x=23"
... return x
...
>>> print horror()
23
Чуть менее ужасно, конечно, было бы exec
в конкретном словаре:
>>> def better():
... d = {}
... exec "x=23" in d
... return d['x']
...
>>> print better()
23
Это, по крайней мере, позволяет избежать загрязнения пространства имен первого подхода.
person
Alex Martelli
schedule
13.04.2010
Иногда мне нужно создавать переменные на лету, выполняя символьные вычисления. Как еще вы предлагаете это сделать, не используя exec?
- person imranal; 19.07.2018
@imranal Мне нужно именно это в моем коде, и единственный способ, который я нашел, - это использовать «exec». Вы нашли какой-либо другой вариант с тех пор
- person taiko; 11.08.2020
худший пример использования exec(), который я когда-либо видел
- person Vaidøtas I.; 05.11.2020
Ответ Алекса работает немного по-другому в Python 3.
Поскольку exec() — это функция в Python 3, используйте следующий шаблон:
def better():
d = {}
exec("x=23", d)
return d['x']
print better()
23
Подробнее см. в этом вопросе: Поведение функции exec в Python 2 и Python 3
person
H. Saxena
schedule
30.09.2018
Есть ли решение для python3, которое не требует создания словаря?
- person Nic Scozzaro; 19.04.2019
Используйте
exec('x=23', globals())
, но обратите внимание, что это добавит все переменные, сгенерированные внутри exec, в вашу глобальную область. Это также перезапишет любые переменные с тем же именем.
- person H. Saxena; 21.04.2019
Да.
class A:
def __init__(self):
self.a1 = ''
self.a2 = ''
def populate():
att1 = raw_input("enter a1: ")
att2 = raw_input("enter a2: ")
my_object = A()
eval("my_obj.a1 = att1")
eval("my_obj.a2 = att2")
if eval("my_obj.a2") == 2:
print "Hooray! the value of a2 in my_obj is 2"
Надеюсь это поможет
person
inspectorG4dget
schedule
13.04.2010
eval и exec, две разные вещи в Python. eval(my_obj.a1 = att1) выдаст вам синтаксическую ошибку (вызванную eval) (вместо этого попробуйте exec).
- person Ponkadoodle; 13.04.2010
eval()
в Python принимает только выражения, а присваивание — это оператор, а не выражение.
- person Greg Hewgill; 13.04.2010
Мне жаль. Я явно сделал плохой пост. Теперь я вижу ошибку и понимаю, что сделал идиотский ход. Думаю, экзаменационный стресс, должно быть, доходит до меня. Извинения.
- person inspectorG4dget; 13.04.2010