Python:没有类的模块中的持久变量?

时间:2013-05-16 01:09:40

标签: python module

编辑:这是我尝试失败的实际代码:

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

“audio”是我写的一个完整的库(在带有 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中的函数依赖于代码段中保留的数据。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这就是我喜欢在没有类的情况下模拟python函数中的持久性/静态变量的方法。这是一个简单的示例来演示。在这种情况下,&#34;静态&#34;变量&#34; islicensed.value&#34;用于确保我们只读取一次注册表,无论我们调用函数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