2010-04-19 3 views
4

좋아, 나는 내 프로젝트 중 하나에서 약간 이상한 행동을하고 나는 누군가가 내게 이유를 말할 수 있기를 바라고있다. 내 파일 구조는 다음과 같습니다 MainFrame.py의 내가 wx.Frame를 확장하는 클래스의 이름 RPMWindow을 정의한 파이썬 와일드 카드 가져 오기 이름 지정된 가져 오기

MainApp.py 
res/ 
    __init__.py 
    elements/ 
    __init__.py 
    MainFrame.py 

내부.

from res.elements.MainFrame import * 

을 그리고 이것은하지 않습니다 :

MainApp.py에서이 작품

from res.elements.MainFrame import RPMWindow 

나는 와일드 카드 가져 오기 아무것도 해치지 않을 것입니다 실현,하지만 난 더 관심이 있어요 와일드 카드가 성공했을 때 명명 된 가져 오기가 실패한 이유를 이해합니다.

Traceback (most recent call last): 
    File "C:\myApps\eclipse\plugins\org.python.pydev.debug_1.5.6.2010033101\pysrc\pydevd.py", line 953, in <module> 
    debugger.run(setup['file'], None, None) 
    File "C:\myApps\eclipse\plugins\org.python.pydev.debug_1.5.6.2010033101\pysrc\pydevd.py", line 780, in run 
    execfile(file, globals, locals) #execute the script 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\MainApp.py", line 2, in <module> 
    from res.elements.MainFrame import RPMWindow 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\res\elements\MainFrame.py", line 2, in <module> 
    from res.elements.MenuBar import MenuBarBuilder 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\res\elements\MenuBar.py", line 2, in <module> 
    from MainApp import _, DataCache 
    File "C:\Documents and Settings\Daniel\workspace\RPM UI - V2\src\MainApp.py", line 2, in <module> 
    from res.elements.MainFrame import RPMWindow 
ImportError: cannot import name RPMWindow 

와일드 카드 가져 오기를 사용하여 내가 역 추적을받지 않고 내 응용 프로그램이 열립니다 클래스 이름을 사용하는 경우

내가이 역 추적을 얻을.

+1

명명 된 가져 오기를 사용할 때 실제로 나타나는 추적을 제공 할 수 있습니까? –

+0

'이 일이 나빴다'는 의미를 나타내십시오. 첫 번째 경우 RPMWindow를 실제로 가져오고 있습니까? – joaquin

답변

8

당신은 원형의 수입이 있습니다

MainFrame.py 간접적으로 MainApp.py 가져 오는, 그리고 MainApp.py는 MainFrame.py를 가져 오는 중입니다. 따라서 MainApp.py가 MainFrame.py를 가져올 때 RPMWindow 클래스가 아직 정의되지 않았으므로 ImportError가 발생합니다.

+0

당신이 지적한대로 이것을 발견했습니다. 나는 그것이 해결됐다고 생각한다. 감사. – Dan

+0

순환 수입이 좋은 습관이 아닌 이유에 대한 캐주얼 알림! – jathanism

0
내가 와일드 카드가 당신을 위해 일하는 이유를 조사 할 시간이 없어

,하지만 난 이 직접 이름을 가져 오기와 실패에 대해 말할 수있는 것은 당신이 당신의 코드에서 가져 오기 사이클을 가지고있다 :

res.elements.MainFrame을 가져 오려고 시도했지만 의 일부가 코드가 을 다시 가져 오려고 시도하는 res.elements.MenuBar을 가져 오려고합니다. IOW, 처음 시도 할 때 res.elements.MainFrame을 다시 시도하기 전에 아직 완료하지 않았습니다.

0

코드에 순환 수입이 있습니다. 동일한 모듈은 특정 모듈을 필요로하며 다른 특정 모듈을 사용해야합니다. 그렇게 생각하면 분명히 불안정합니다. 대부분의 문제는 import a 이상을 사용하여 from a import b 또는 from a import * 대신 a.b을 참조하여 해결할 수 있습니다.

특히, 결코from a import *을 사용하십시오. 와일드 카드 가져 오기를 사용하면 네임 스페이스가 복잡해지고 코드를 유지 관리하기 쉽고 읽기 쉽고 정상적으로 예측할 수 있습니다. import afrom a import *의 차이는 상자를 실내로 끌고 내용을 바닥 전체에 쏟아 넣는 것의 차이입니다.

공유 코드를 자체 모듈로 옮기거나 순환 가져 오기가 필요 없도록 리팩터링하는 것이 더 좋을 것입니다. 순환 수입은 항상 디자인 문제를 나타냅니다.