Python exe c не захватывает область действия при вызове через функцию - PullRequest
0 голосов
/ 11 июля 2020

У меня есть функция test(), которая должна проверять, является ли строка допустимым файлом Python. (Строка обычно извлекается из файла readme или около того.) Запуск exec() в строке работает хорошо, если только в этой ситуации:

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

Почему exec() не обнаруживает import math если вызывается через функцию, но работает при запуске в основной области? Как обойти это в test()?

1 Ответ

1 голос
/ 11 июля 2020

Это немного сложно объяснить правильно, но это сработает, если вы сделаете это:

def test():
    exec(string, {"__MODULE__": "__main__"})

По сути, import math не существует в функции f, если он не объявлен в основной области видимости .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...