2011-08-29 65 views
4

我有兩個Python模塊:Python的範圍/命名空間的問題

//// funcs.py

from classes import * 

def func(): 
    d = D() 
    print "func" 

if __name__ == "__main__": 
    c = C() 

//// classes.py

from funcs import * 

class C: 
    def __init__(self): 
     print "C class" 
     func() 

class D: 
    def __init__(self): 
     print "D class" 

運行funcs.py產生一個NameError,稱「全局名稱'D'未定義」。但是,如果我註釋掉D()實例的創建,那麼一切正常。

爲什麼會出現這種情況?

感謝

回答

2

問題的發生是由於模塊初始化期間使用循環導入模塊的嘗試。爲了澄清,使用「from module use *」需要編譯一個模塊。相反,如果你在這兩種情況下切換到使用「導入模塊」,它應該可以正常工作。

+1

「要求編譯模塊」充其量是誤導性的。模塊代碼被加載,編譯和運行。但是'import mim''複製模塊中的所有內容,'import m'給出模塊對象的引用,因此可以看到後面的修改。 – delnan

5

這一個正常工作沒有你的代碼複雜:

///funcs.py

import classes 

def func(): 
    d = classes.D() 
    print "func" 

if __name__ == "__main__": 
    c = classes.C() 

///classes.py

import funcs 

class C: 
    def __init__(self): 
     print "C class" 
     funcs.func() 

class D: 
    def __init__(self): 
     print "D class" 

有時是更好的使用簡單進口,比from ... import ...。 這裏有相當不錯的文章: http://effbot.org/zone/import-confusion.htm