У меня есть код Python (2.7) с использованием exec ():
import math
def some_function(a, b):
return a+b
safe_dict = { 'Sqrt': math.sqrt, 'Smurf': some_function, "__builtins__": None }
with open('my_file.py') as f:
exec(f.read(), safe_dict, {})
print('The End')
И "my_file.py": print ('в сценарии выполнения')
print('sqrt(2) = %f' % Sqrt(2)) # Call to math.sqrt through name 'Sqrt' given in globals
print('3+4 = %d' % Smurf(3, 4)) # Call to some_function through name 'Smurf' given in globals
def my_func(x):
return Sqrt(2+x)
print("my_func: %f" % my_func(1)) # No problems
def my_func2(x, f):
return f(x-1)
print("my_func2: %f" % my_func2(5, my_func)) # No problems too
def my_func3(x):
return my_func(x-1) # Here, leads to a "NameError: global name 'my_func' is not defined" in the next line
print("my_func3: %f" % my_func3(5))
Я не понимаю, почему в my_func3 возникает ошибка NameError, когда он пытается вызвать my_func.
Почему my_func3 не может вызвать my_func, даже если он определен ранее?
Есть ли способ заставить его работать (не с my_func, определенным в основном модуле)?
редактировать Ошибка:
Traceback (most recent call last):
File "main.py", line 9, in <module>
exec(f.read(), safe_dict, {})
File "<string>", line 16, in <module>
File "<string>", line 15, in my_func3
NameError: global name 'my_func' is not defined
Помимо ошибок, почти наверняка ваш подход небезопасен, ознакомьтесь с этим сообщением и элегантным решением stackoverflow.com/a/9558001/6260170
Не используйте этот подход, но проблема в том, что вы предоставляете как глобальные, так и локальные dict. В этом случае код выполняется так, как если бы он был встроен в определение класса.
exec(f.read(), safe_dict, safe_dict)
заставит его работать, и вы можете найти объяснение в эта почта@ juanpa.arrivillaga и Кан: спасибо вам обоим. Я лучше понимаю, почему это не сработало. Если бы вы ответили, я бы принял его.
показать настоящее сообщение об ошибке