2010-11-21 2 views
1

Когда я запускаю следующий образец:Динамический модуль загрузки области видимости в Python

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

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

a() 

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

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

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

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

+0

Почему вы не просто 'импорт math' в верхней части файла, который содержит' B() '? – bgporter

+0

Хм ... Я не спрашиваю: «Почему?». Может быть, 'globals() ['math'] = __import __ (" math ")'? Выглядит уродливо :) – khachik

+0

, потому что я не знаю заранее, что хочу использовать математический модуль. «Математика» здесь просто приведена. Я хочу загрузить любой модуль во время выполнения из функции a() – Alexandros

ответ

2

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

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) 
+1

why 'm = __import (" math ")', а не просто 'import math as m'? – aaronasterling

+0

это то, что я искал для благодарности - всякий раз, когда я получаю очки, я проголосую за это – Alexandros

+0

@aaronasterling, потому что я пришел к этому после того, как поместил в 'globals()' в 'a', ничего особенного. – khachik

2

Один из подходов к 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() 
+0

это тоже отличный ответ – Alexandros

Смежные вопросы