2010-11-21 42 views
1

Quand je lance l'exemple suivant:dynamique Module champ de chargement en Python

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

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

a() 

Je reçois l'erreur suivante: NameError: nom global « mathématiques » est pas défini

Ce que je suis en train faire est de charger dynamiquement certains modules à l'intérieur de la fonction a() et les utiliser dans la fonction b()

Je veux que ce soit aussi transparent que possible pour le point de vi de b() ew. Cela signifie que je ne veux pas charger le module avec _ _ import _ _ dans a() et passer une référence à la fonction b(), en fait il est obligatoire que la signature de la fonction b() reste juste cette : b()

est-il un moyen de le faire les gars? merci!

+0

Pourquoi ne pas simplement 'math' d'importation en haut du fichier qui contient' b() '? – bgporter

+0

Hmm ... Je ne demande pas "Pourquoi?". Peut-être 'globals() ['math'] = __import __ (" math ")'? Regarde moche :) – khachik

+0

parce que je ne sais pas à l'avance que je veux utiliser le module de mathématiques. "math" est juste en exemple ici. Je veux charger n'importe quel module pendant l'exécution à partir de la fonction a() – Alexandros

Répondre

2

Sur des commentaires sur le message: si vous voulez charger l'exécution des modules, charge dont vous avez besoin:

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

Répondre à votre question:

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

pourquoi 'm = __import (" math ")' et pas simplement 'import math comme m'? – aaronasterling

+0

c'est ce que je cherchais merci - chaque fois que je reçois des points je vais voter ceci – Alexandros

+0

@aaronasterling parce que je suis arrivé à cela après avoir mis à 'globals()' dans 'a', rien de spécial. – khachik

2

Une approche pour Python 2.x serait:

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

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

a() 

Mais je recommande généralement l'utilisation __import__(). Je ne sais pas ce que vous en train d'essayer d'atteindre, mais peut-être que cela fonctionne pour vous:

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

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

a() 
+0

cela aussi est une bonne réponse – Alexandros