编辑:这是我尝试失败的实际代码:
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中的函数依赖于代码段中保留的数据。
答案 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