Запуск exec внутри функции

Как вы можете использовать ключевое слово python exec внутри функций?


person Community    schedule 13.04.2010    source источник
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
comment
Иногда мне нужно создавать переменные на лету, выполняя символьные вычисления. Как еще вы предлагаете это сделать, не используя exec? - person imranal; 19.07.2018
comment
@imranal Мне нужно именно это в моем коде, и единственный способ, который я нашел, - это использовать «exec». Вы нашли какой-либо другой вариант с тех пор - person taiko; 11.08.2020
comment
худший пример использования 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
comment
Есть ли решение для python3, которое не требует создания словаря? - person Nic Scozzaro; 19.04.2019
comment
Используйте 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
comment
eval и exec, две разные вещи в Python. eval(my_obj.a1 = att1) выдаст вам синтаксическую ошибку (вызванную eval) (вместо этого попробуйте exec). - person Ponkadoodle; 13.04.2010
comment
eval() в Python принимает только выражения, а присваивание — это оператор, а не выражение. - person Greg Hewgill; 13.04.2010
comment
Мне жаль. Я явно сделал плохой пост. Теперь я вижу ошибку и понимаю, что сделал идиотский ход. Думаю, экзаменационный стресс, должно быть, доходит до меня. Извинения. - person inspectorG4dget; 13.04.2010