2013-02-28 1 views
0

두 개의 모듈, baselib.Database 및 baselib.Application이 있습니다. baselib.Application에서 , 나는 이러한 모듈 중 하나를 가져올 때 문제는, 내가파이썬의 순환 모듈 의존성

AttributeError: 'module' object has no attribute (modulename) 

얻을 수있다

import baselib.Database 

APP = None 
class BaseApplication(): 
    def __init__(dbClass = baselib.Database.GenericDb...): 
     global APP 
     this.dbClass = dbClass 
     APP = this 
     etc... 

이 baselib.Database에서, 나는

import baselib.Application 

def getDB(dbClass = baselib.Application.APP.dbClass): 
    etc... 

class GenericDB(): 
    def __init__(self, args): 
    etc... 

을 가지고 있습니다 이 문제는 기본 인수가 가져 오는 동안 평가된다는 사실에서 비롯된 것으로 보입니다. 만약 내가 get12를

def getDB(dbClass = None): 
    dbClass = dbClass or baselib.Application.APP.dbClass 

으로 대체하고 다른 기본 인수를 사용하면 모든 것이 잘 동작합니다. 이 작업을 수행하는 가장 좋고/가장 파이썬적인 방법입니까, 아니면 단순히 순환 의존성을 완전히 피하고 두 모듈을 하나의 파일로 결합해야합니까? 내 코드베이스의 대부분이 그것들에 의존하기 때문에 나는 그것들을 별도로 유지하고 싶다.

+0

게시자가 게시 한 코드 때문에 그 오류가있는 것은 아닙니다. 오류의 전체 스택 추적과 함께 전체 코드를 게시하십시오. –

+0

oops, baselib.Database에 GenericDB 클래스의 선언을 포함하는 것을 잊었습니다. – sfendell

+0

여전히 도움이되지 않습니다. 전체 코드를 게시하십시오. –

답변

1

나는이 http://effbot.org/zone/import-confusion.htm#circular-imports가 귀하의 질문에 대한 답변을 줄 수 있다고 생각합니다. 기본적으로 가져 오기도 성명서입니다. 순환 모듈 의존성을 피해야합니다.

+0

내 유일한 옵션은 두 모듈을 하나로 결합하는 것입니다. – sfendell

+1

@sfendell 모든 언어에서 순환 의존성이 나쁘다고 생각합니다. 그리고 파이썬에서 다른 객체를 사용하고 싶다면 정의를 가져올 필요가 없습니다. 바인딩은 런타임에 발생합니다. – zchenah

+0

나는 생각한다. 감사! – sfendell