2010-06-20 5 views
11

에서 선언 된 변수에 액세스하는 방법 : 파이썬 : 파이썬 문서에서 구조를 사용하여 부모 모듈

sound/ 
    __init__.py 
    effects/ 
      __init__.py 
      echo.py 
      surround.py 
      reverse.py 

내가 import sound.effects에 원하는 특수 효과의 목록을 말한다. sound.effects에 모듈 수준 변수를 선언하고 각 .py 파일을 가져올 때 추가 할 수 있습니다. 그래서 음향/효과/__ init__.py는 다음과 같습니다

effectList = [] 
import echo 
import surround # Could write code to import *.py instead 
... 

을 내 주요 코드에서 지금 효과의 목록을 가져올 수 sound.effects.effectList에 액세스 할 수 있습니다,하지만 어떻게 내가 할 echo.py 내에서 effectList 액세스합니까 실제 추가 하시겠습니까? 나는 변수에 대한 액세스를 얻을려고 붙어 :

# None of these work :-(
# from . import self 
# from .. import effects 
# import sound.effects 

sound.effect.effectList.append({'name': 'echo'}) 

답변

6

이 상황에서 사람들이 일반적으로하는 일은 모듈에 common.py 파일을 만드는 것입니다. 그런 다음

sound/ 
    __init__.py 
    effect/ 
      __init__.py 
      common.py 
      echo.py 
      surround.py 
      reverse.py 

당신은 __init__.py에서 common.py에 코드를 이동 :이이

effectList = [] 
import echo 
import surround # Could write code to import *.py instead 
... 

__init__.py 내부의

:

from common import * 

을 이제 echo.py 당신이이있을 것이다

import common 
common.effectList.append({'name': 'echo'}) 
사운드를 가져

뭐든지 나는 단지이 나 자신을 사용하기 시작했습니다이

import sound.effect 

for effect_name,effect in sound.effect.effectlist.items(): 
    #.... 

처럼 사용한다, 그러나 나는 파이썬 사회에서 일반적인 관행 믿습니다.

+0

완벽하게 작동했습니다. 많은 감사합니다. (for 루프는 그대로 실행되지 않습니다.) – Malvineous

+0

몇 가지 추가 통찰력을 보려면 여기를 참고하십시오 : http://stackoverflow.com/a/142601/4561887 –

2

나는 당신이 effects 패키지 내부의 __init__.py에 "사용할 수 있도록"을 남겨보다는 모든 모듈 자동이 effectList을 채울 수 있어야한다 생각합니다. 내가 생각할 수있는 몇 가지 이유. 어떻게 든이 일을 얻기 위해 관리 않은 경우

  1. 당신은 (그들이 가져 오기 모듈에서 effectList을 제외시켰다 것) 패키지를 통해 제외하고는 효과 중 하나를 가져올 수 없습니다.
  2. 작성한 모든 효과에서 추가 작업을 수동으로 수행해야합니다. __init__.py에있는 import *.py과 같은 것을 구현하면 모든 것을 현재 디렉토리에로드하여 사용 가능하게 만든 것이 더 낫습니다.

귀하의 __init__.py에 이와 같은 내용이 있습니다.

import os, glob 

effectslist = [] 

for i in glob.glob("*.py"): 
    if i == "__init__.py": 
     next 
    print "Attempting to import %s"%i 
    try: 
     mod = __import__(os.path.splitext(i)[0]) 
     effectslist.append(mod) 
    except ImportError,m: 
     print "Error while importing %s - %s"%(i,m) 
+0

빠른 답장을 보내 주셔서 감사합니다. 필자의 경우에는 음향 효과가 아니지만 정적 인 데이터 (가난한 사람의 데이터베이스와 비슷하다.)는 아무도 없다. 아무도 단일 "효과"를 가져 오지 않으므로 결과 오류는 실제로 문제가되지 않는다. 하지만 일을 분리하여 보관하는 것에 대한 귀하의 요점을 보았습니다. 아마 init 코드에서 모든 추가 작업을 수행해야합니다. 조금 더 복잡해 지겠지만 각 하위 모듈은 분리되어 있습니다. – Malvineous

+0

효과 (예 : 테스트 등)로 효과를 가져 오려고 할 수 있습니다. 다른 재미있는 효과는 새로운 효과를 얻으려면 파일을이 디렉토리에 드롭하는 것입니다. –