2

編集:失敗した実際のコードは次のとおりです。

サウンド.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

スタッフ.py

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

これは可能ですか?stuff.py(これは質問のポイントを強調するために非常に単純化されています)には、ユーザーが複数のクラスをインスタンス化できないようにしたくないコードが含まれているため、これを行いたいです。アプリ全体で、このコードの「インスタンス」が 1 つだけ必要です。しかし、stuff.py の関数は、コードのそのセクション内に保持されているデータに依存します。

4

2 に答える 2

7

はい、可能です。あなたはそれをしました。

--

あなたの更新について:これは完全に異なる質問であり、完全に異なるコードを示しています。

コードの問題は、2 つの異なる変数があることです。

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
于 2013-05-16T01:14:07.780 に答える