2016-07-28 2 views
0

저는 여러 가지 서비스에서 사용자 정보를 요청하고 몇 가지 방법으로 함께 묶는 프로그램을 작성하고 있습니다. 물건을 관리하고 느슨한 상호 작용을합니다. 내 모든 파이썬 프로젝트는 특정 크기로 문제가 발생합니다. 수입은 재귀 적으로되기 시작하고 주변의 데이터를 다루는 것은 짜증나게됩니다.파이썬 클래스, 데이터 구조 및 적절한 아키텍처

간단한 예제를 통해 방금 만난 문제의 빠른 예를 볼 수 있습니다. 기본 객체 (싱글 톤)를 생성하는 메인 모듈 (여기에서는 A)이 있습니다. 이 객체들은 서로 함수를 호출해야하므로 main을 커넥터로 사용합니다. 이 예제에서는 B가 생성 될 때 A가 요청한 목록이 (없음) NoneType 인 경우를 이해하지 못합니다. 게터 기능은 반드시 내가가는 길은 아니지만 다른 상황에서 도움이되었습니다. 팁, 중점적 인 파이썬 프로그램을 구조화하는 방법을 알려주고 있습니다. 감사!

import B 

some_list = None 
b = None 

def get_list(): 
    return some_list 

if __name__ == "__main__": 
    some_list = [1,2,3] 
    b = B.B() 
    print b.my_list 

그리고 모듈 B

from A import get_list 

class B: 
    def __init__(self): 
     self.my_list = get_list().map(lambda v : v * 2) # CRASH HERE! 

답변

3

는 이제 메인 모듈의 이 개 사본 각 sys.modules에서 별도의 항목이 있습니다

  1. 초기 파이썬 스크립트를,에서 시작 명령 줄은 항상 __main__입니다.

  2. A.py 파일을 A 모듈로 가져 왔습니다. 이것은 __main__ 모듈의을 구분합니다.

예, 동일한 소스 파일이 두 모듈을 제공했지만 파이썬은 두 모듈을 별개로 간주합니다.

결과적으로 __name__ 변수가 'A'으로 설정되어 있기 때문에 두 번째 복사본에는 if __name__ == '__main__': 블록이 실행되지 않습니다. 따라서 A.some_listA.bNone으로 설정되어 있습니다. 대신 __main__.some_list__main__.b을 원했습니다.

다른 모듈에서 가져 오기 위해 액세스해야하는 코드를 기본 진입 점에 두지 마십시오. 과 같은 종속성을 전달하거나 주 모듈과 다른 모듈이 모두 가져올 수있는 별도의 모듈로 관리되도록 할 수 있습니다.

b = B.B(get_list) 
+0

MMH 확실하지의 경우 버전 일 (2.7.11)을하지만 난에 대한'__main__'을 사용할 수 없습니다 :

당신은, 예를 들어, B() 클래스에 함수에 전달할 수' NameError : 전역 이름 '__main__'이 정의되지 않았습니다 .. – ramin

+0

@ramin : 이것은 Python 버전이 아닙니다. '__main__ '을 (를) 가져 오지 않았습니다. –

+0

심지어 tho pycharm도 __main __을 (를) 가져 오지 못하는 것에 대해 불평합니다. fct : D 덕분에지도를 수정 한 후에 작동합니다. – ramin

관련 문제