2013-05-16 2 views
0

편집 : 오디오 수 있습니다Python : 클래스가없는 모듈의 영구 변수?

sounds.py

import audio 
import time 

localAudioPlayer = None 

def Play(soundString, wait=True): 
    if (localAudioPlayer != None): 
     localAudioPlayer.stop() 
    localAudioPlayer = audio.stream("sound/%s.ogg" % soundString) 
    localAudioPlayer.play() 
    if (wait == True): 
     while (localAudioPlayer.playing == True): 
      time.sleep(0.1) 
    return 

"오디오"(AN 초기화있는 폴더에서) 내가 쓴 완벽한 라이브러리입니다 : 여기에 내가 실패했습니다 실제 코드는 재생.

사운드가 이미 재생되는 동안 Play()가 호출되면 해당 사운드가 중지되어야한다는 아이디어가 있습니다.

실제 코드를 재생하지 않고도 audio.stream() 객체를 인스턴스화 할 수 있도록 코드를 설정하지 않았으므로 미리 초기화하는 것이 좋습니다.

나는 원래의 예제와 비슷한 코드를 시도했다. (stuffLocalVar = None으로 설정 한 다음 함수에서 None을 테스트했다.) 정상적으로 작동했다. 그래서 이것은이 특정 코드에 특정한 것입니다.

파이썬 콘솔에서 "사운드 가져 오기"를 수행하고 직접 Play()를 실행하려고했을 때 동일한 추적 기능을 사용했습니다.

역 추적 :

>>> sounds2.Play("file.ogg") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "sounds2.py", line 7, in Play 
    if (localAudioPlayer != None): 
UnboundLocalError: local variable 'localAudioPlayer' referenced before assignment 

원래

나는이 설정에 대한 적절한 용어의 확실하지 않다, 그래서 내가 당신에게 간단한 예를주게 :

mainApp.py을 :

import stuff 
print stuff.do() # should print 16 
stuff.stuffLocalVar = 8 
print stuff.do() # should print 32 

stuff.py

stuffLocalVar = 4 
def do(): 
    return stuffLocalVar * 4 

이 작업을 수행 할 수 있습니까? 나는 이것을하기를 원한다. 왜냐하면 stuff.py (이것은 질문의 요점을 강조하기 위해 엄청나게 단순화 되었기 때문에)가 사용자가 여러 클래스를 인스턴스화 할 수 없도록하려는 코드를 포함하기 때문이다. 이 코드에는 응용 프로그램과 관련된 하나의 "인스턴스"만 있으면됩니다. 그러나 stuff.py의 함수는 해당 코드 섹션 내에 보유 된 데이터에 의존합니다.

+0

왜이 작업을 수행해야합니까? – Blender

+0

이것을 시도해보고 효과가 있는지 쉽게 알 수 있습니다 ... –

+0

이들은 두 가지 완전히 다른 질문이지만 내 대답을 업데이트했습니다. – Marcin

답변

5

예 가능합니다. 방금 했어.

- 당신의 업데이트를 다시

: 이 완전히 다른 코드를 보여주는 완전히 다른 질문입니다.

outervar = None # this is global 

def foo(): 
    if(outervar): #this refers to the local variable 
     outervar = "you fail it" # this creates a local variable 

당신이 원하는 것은 :

outervar = None # this is global 

def foo(): 
    global outervar # prevents creation of local variable called outervar 
    if(outervar): 
     outervar = "you win it" # this assigns to global variable 
+0

내가 한 것과 똑같이 시도했는데 "unboundLocalError"예외가 발생했습니다. 내 응용 프로그램이 실제로 여러 스레드를 사용하여 작업을 수행한다는 사실과 관련이 있는지 궁금합니다 ... – fdmillion

+0

@fdmillion 아니요, 변수가로드시 초기화되기 때문에 발생하지 않아야합니다. 추적을 게시하십시오. – Marcin

+0

@fdmillion 추적 표시로 질문에 넣으십시오. – Marcin

0

이 내가의 지속적인/정적 변수를 모방하고자하는 방법이다

코드의 문제는 두 개의 서로 다른 변수를 가지고있다 파이썬 함수없이 클래스. 이것은 설명하기위한 간단한 예입니다. 이 경우 "정적"변수 "islicensed.value"는 islicensed() 함수를 몇 번 호출했는지에 상관없이 레지스트리를 한 번만 읽을 수 있도록하기 위해 사용됩니다. 필자는 전역 변수를 사용하지 않는 편이 더 좋을 것 같습니다.

def islicensed(): 

    try: # trick to mimic a persistent/static variable so I don't have to read the registry but once 
     return islicensed.value 
    except AttributeError: 
     # read registry for license values 
     settings = QtCore.QSettings("company", "myapp") 
     license = str(settings.value("license")) 

     if license == "somevalue": 
      islicensed.value = True 
     else: 
      islicensed.value = False 

     return islicensed.value