2011-08-29 4 views
4

나는 두 파이썬 모듈이 있습니다파이썬 범위/네임 스페이스 문제

//// 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는 "전역 이름 'D'이 정의되어 있지 않다는 것을 나타내는 NameError를 생성합니다. 그러나 D() 인스턴스의 생성을 주석 처리하면 모든 것이 잘 동작합니다.

왜 이런 일이 발생합니까?

감사

답변

2

문제로 인해 모듈 초기화하는 동안 주기적으로 수입 된 모듈을 사용하려는 시도에 발생합니다. 명확하게하려면 "모듈에서 사용"을 사용하려면 모듈을 컴파일해야합니다. 대신 "가져 오기 모듈"을 두 경우 모두 사용하도록 전환하면 정상적으로 작동합니다.

이 ///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" 

이 훨씬 더 간단한 사용하는 것 :

+1

"모듈을 컴파일해야 함"은 기껏해야 오도하는 것입니다. 모듈 코드는로드되고, 컴파일되고 어느쪽으로 든 실행됩니다. 그러나'from m import *'는 그 시점에 모듈에있는 모든 것을 복사하는 반면,'import m '은 모듈 객체에 대한 참조를 제공하므로 나중에 수정을 볼 수 있습니다. – delnan