2013-05-16 28 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 

「音頻」是我寫的一個完整的庫(文件夾中有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中的函數依賴於該代碼段中保留的數據。

+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

這是我怎麼樣去模仿一個持久/靜態變量沒有類的python函數。這是一個簡單的例子來演示。在這種情況下,「static」變量「islicensed.value」用於確保我們只讀取一次註冊表,無論我們調用函數islicensed()多少次。我寧願避免使用全局變量,這似乎稍微pythonic。

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