Область загрузки динамического модуля в Python - PullRequest
1 голос
/ 21 ноября 2010

Когда я запускаю следующий образец:

def a():
    exec('import math')
    b()

def b():
    print math.cos(90)

a()

Я получаю следующую ошибку: NameError: глобальное имя 'math' не определено

То, что я пытаюсь сделать, это динамически загружать некоторые модули из функции a () и использовать их в функции b ()

Я хочу, чтобы это было как можно более плавно для точки зрения b (). Это означает, что я не хочу загружать модуль с _ _ import _ _ в a () и передавать ссылку на функцию b (), фактически обязательно, чтобы сигнатура функции b () оставалась именно : b ()

есть ли способ сделать это, ребята? спасибо!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

При комментариях к посту: если хотите загружать модули времени выполнения, загружайте туда, где вам нужно:

def b():
  m = __import__("math")
  return m.abs(-1)

Ответ на ваш вопрос:

def a():
  if not globals().has_key('math'):
    globals()['math'] = __import__('math')

def b():
  """returns the absolute value of -1, a() must be called before to load necessary modules"""
  return math.abs(-1)
2 голосов
/ 21 ноября 2010

Один подход для Python 2.x будет:

def a():
    exec 'import math' in globals()
    b()

def b():
    print math.cos(90)

a()

Но я бы вообще рекомендовал использовать __import__(). Я не знаю, чего вы на самом деле пытаетесь достичь, но, возможно, это работает для вас:

def a():
    global hurz
    hurz = __import__("math")
    b()

def b():
    print hurz.cos(90)

a()
...