Задать вопрос
@zavilskij_nikita

Как передать команду функции, содержащей exec()?

Делаю функцию, которая будет выполнять команду с помощью exec и печатать время выполнения. Также предусмотрена переменная ret, которая, если в команде идет присваивание с ее использованием, должна быть напечатана.

Экспериментальный код :
def runner(code):
    try :
        t = time.time()
        ret = ''
        exec(code)
        #print(ret)
        t = time.time() - t
    except:
        print('error')
        return "Error"
    an = 'Time : '+ str(t)+'.Ans : '+str(ret)
    return an


Пример вызова :
runner('ret = 10**5')

Но вывод измененного ret не происоходит, хотя если попробовать это сделать в шелле, всё работает :
>>> code
'ret = 7'
>>> ret
''
>>> exec(code)
>>> ret
7
>>>


В самой функции явно происходит выполнение - с усложнением задачи таймер показывает увеличенное значение:
>>> runner('s = 19**2000000')
code = "s = 19**2000000"
try
'Time : 1.6354055404663086,Ans : '
>>> runner('s = 19**20000000')
code = "s = 19**20000000"
try
'Time : 59.313780546188354,Ans : '
>>>

В чём ошибка?
  • Вопрос задан
  • 239 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
scope in exeс погуглите.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zavilskij_nikita Автор вопроса
Спасибо за помощь, найдено решение по запросу "scope in exec" :
...
try:
        namespace = {'answer' : ''}
        t = time.time()
        exec(code, namespace)
        t = time.time() - t
...
an = 'Time : '+ str(t)+'.Ans : '+str(namespace['answer'])
return an
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы