2012-06-27 51 views
3

試圖尋找該網站,但無法找到一個答案,我的問題:分級命名空間

可以說我有一個模塊,名爲mymodule.py包含:

def a(): 
    return 3 

def b(): 
    return 4 + a() 

然後以下作品:

import mymodule 
print(mymodule.b()) 

然而,當我嘗試動態定義模塊內容:

import imp 

my_code = ''' 
def a(): 
    return 3 

def b(): 
    return 4 + a() 
''' 

mymodule = imp.new_module('mymodule') 
exec(my_code, globals(), mymodule.__dict__) 
print(mymodule.b()) 

然後失敗的函數B():

Traceback (most recent call last): 
File "", line 13, in <module> 
File "", line 6, in b 
NameError: global name 'a' is not defined 

我需要一種方法來保存分級名字空間模塊搜索,這似乎除非模塊駐留在磁盤發生故障。

任何線索至於有什麼區別?

謝謝, Rob。

回答

3

你很近。你需要告訴EXEC在不同的命名空間的工作,像這樣(見注在底部蟒蛇3.X):

exec my_code in mymodule.__dict__ 

完整的示例:

import imp 

my_code = ''' 
def a(): 
    return 3 

def b(): 
    return 4 + a() 
''' 

mymodule = imp.new_module('mymodule') 

exec my_code in mymodule.__dict__ 
print(mymodule.b()) 

此說,我沒有用這之前,所以我不確定是否有任何奇怪的副作用,但它看起來對我有用。

此外,在Python文檔這裏有關於一個小的Blurb「EXEC在...」:http://docs.python.org/reference/simple_stmts.html#the-exec-statement

更新

原來的企圖沒有正常工作的原因是你路過你的目前的模塊的globals()字典,它與你的新模塊應該使用的globals()不同。

此exec線也可以(但並不像漂亮 '在EXEC ...' 風格):

exec(my_code, mymodule.__dict__, mymodule.__dict__) 

更新2:由於Exec現在是在Python 3的功能。 x,它沒有'exec in ...'風格,所以必須使用上面的行。

+0

是否有一個python 3.x版本的「exec ... in」? 似乎無法在exec()函數中找到它。 謝謝 – rbairos

+0

它看起來不像它...看到我的更新,'不太漂亮'的版本應該在3.x中爲你工作(我還沒試過,所以讓我知道它是否有效) –

+0

好吧,我測試過'exec(my_code,mymodule .__ dict__,mymodule。__dict __)'在python3中,它似乎工作正常。我已經更新了我的答案以反映這一點。 –

0

這不是exec()的設計目的。 exec()實際上並沒有將其運行的代碼「放入」任何模塊 - 它在exec()被調用的模塊空間中運行。

+0

那麼有沒有其他辦法可以重現我需要的模塊行爲?謝謝 – rbairos