編輯:這是我嘗試失敗的實際代碼: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
「音頻」是我寫的一個完整的庫(文件夾中有INIT),讓音頻回放。
這裏的想法是,如果在播放聲音時調用Play(),則應停止播放聲音。
我沒有我的代碼設置,我可以在沒有實際文件的情況下實例化audio.stream()對象,因此預初始化並不是一個好主意。
我嘗試了類似的代碼與我的原始示例(我設置stuffLocalVar = None然後在函數中測試它爲None)並且它工作正常。所以這是特定的代碼。
當我在Python控制檯「導入聲音」,並試圖直接執行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中的函數依賴於該代碼段中保留的數據。
爲什麼你需要這樣做? – Blender
似乎它會很容易地嘗試這個,看看它是否工作... –
這是兩個完全不同的問題,但我已經更新了我的答案。 – Marcin