2010-11-21 5 views
1

: NameError: aşağıdaki hatayı alıyorumDinamik Modül yükleme kapsamı aşağıdaki örnek çalıştırdığınızda

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

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

a() 

küresel adı 'matematik' tanımlı değil ben çalışıyorum ne

Bazı modülleri bir() işlevi içinde dinamik olarak yüklemek ve bunları b()

içinde kullanmaktır. b() 'nin vi noktası için mümkün olduğunca kusursuz olmasını istiyorum ew. Yani, modülü _ _ import _ _ ile bir() içine yüklemek istemiyorum ve b() fonksiyonuna bir referans iletmek istemiyorum, aslında b() 'nin fonksiyon imzasının sadece bu şekilde kalması zorunludur. : b()

Bu adamlar için herhangi bir yolu var mı? teşekkürler! Python 2.x için

+0

Neden siz 'b()' içeren dosyanın üst kısmında sadece 'ithalat math'? – bgporter

+0

Hmm ... "Neden?" Diye sormuyorum. Belki globals() ['matematik'] = __import __ ("matematik") '? Çirkin görünüyor :) – khachik

+0

çünkü önceden matematik modülünü kullanmak istediğimi bilmiyorum. Burada "matematik" sadece bir örnektir. Çalışma sırasında herhangi bir modülü yüklemek istiyorum() fonksiyonu – Alexandros

cevap

2

:

def b(): 
    m = __import__("math") 
    return m.abs(-1) 
: İhtiyaç modülleri çalışma zamanını, yükü yüklemek istiyorsanız

sorunuza cevaplama:

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

neden 'm = __import (" matematik ")' ve sadece m 'olarak matematik ithal değil? – aaronasterling

+0

Bu ne için aradığımı şükrediyorum - ne zaman puan alırsam, bu – Alexandros

+0

@ aaronasterling'i kullanacağım, çünkü bu 'globals()' a 'a' a koyulduktan sonra geldim, özel bir şey değil. – khachik

2

Bir yaklaşım olacaktır:

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

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

a() 

Ama genelde __import__() kullanarak öneriyoruz. Ben aslında ulaşmak için çalışıyoruz bilmiyorum, ama belki bu sizin için çalışır: yazıya yorum üzerine

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

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

a() 
+0

Bu da büyük bir cevap – Alexandros