I have a function test() that should check if a string is a valid Python file. (The string is typically extracted from a readme or so.) Running exec() on the string works well, unless in this situation:
string = """
import math
def f(x):
return math.sqrt(x)
f(2.0)
"""
# no problem:
# exec(string)
def test():
exec(string)
test() # NameError: name 'math' is not defined
Traceback (most recent call last):
File "d.py", line 17, in <module>
test()
File "d.py", line 15, in test
exec(string)
File "<string>", line 7, in <module>
File "<string>", line 5, in f
NameError: name 'math' is not defined
Why does exec() not pick up on the import math if called through a function, but works when running it in the main scope? How to work around it within test()?
It's a bit hard to explain properly but it will work if you do this:
Basically, the
import mathdoes not exist in theffunction unless it's declared in the main scope.