-2

Python で掲示板システム (BBS) をエミュレートするコードを書いています。

このコードを使用して、既に入力されたメッセージを表示するか、後で表示するメッセージを入力するかのオプションをユーザーに提供したいと考えています。

私のコードは次のとおりです。

def BBS():
 print("Welcome to UCT BBS")
 print("MENU")
 print("(E)nter a message")
 print("(V)iew message")
 print("(L)ist files")
 print("(D)isplay file")
 print("e(X)it")

selection=input("Enter your selection:\n")

 if selection=="E" or selection=="e":
    message=input("Enter the message:\n")
 elif selection=="V" or selection=="v":
    if message==0:
        print("no message yet")
    else:
        print(message)
 elif selection=="L" or selection=="l":
    print("List of files: 42.txt, 1015.txt")
 elif selection=="D" or selection=="d":
    filename=input("Enter the filename:\n")
    if filename=="42.txt":
        print("The meaning of life is blah blah blah ...")
    elif filename=="1015.txt":
        print("Computer Science class notes ... simplified")
        print("Do all work")
        print("Pass course")
        print("Be happy")
    else:
        print("File not found")
 else:
    print("Goodbye!")

BBS()

メッセージを入力すると、コードは v が選択された後にメッセージを表示することになっています。または、メッセージが入力されていない場合、v が選択された場合は「まだメッセージがありません」が表示されることになっています。

エラーが発生します:

Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "C:\Program Files\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 15, in BBS
builtins.UnboundLocalError: local variable 'message' referenced before assignment

WingIDE 使用中に v を選択した場合。

このコードを修正してください。

4

2 に答える 2

1

変数messageは、 1 つのブランチでのみ割り当てられます。代わりに他のブランチが選択された場合、変数は定義されません。 if

最初に空の値を指定します。

 message = None

 if selection=="E" or selection=="e":
      message=input("Enter the message:\n")
 elif selection=="V" or selection=="v":
      if not message:
          print("no message yet")
      else:
          print(message)
于 2013-03-29T16:56:37.340 に答える
0

あなたが抱えている問題は、それmessageが関数内のローカル変数であることです。関数が終了すると、関数を再度実行しても、指定された値は失われます。これに対処するには、コード内の何かを変更する必要がありますが、変更する内容は、プログラムをどのように編成するかによって異なります。

1 つのオプションは、関数が複数回実行された場合に繰り返しアクセスできるグローバル変数にすることです。これを行うには、まずグローバル レベル (関数の外側) で値を割り当て、次にglobal関数内でステートメントを使用して、アクセスしたいグローバル名であることを Python に明確にします。

message = None

def BBS():
    global message
    # other stuff

    if foo():
        message = input("Enter a message: ")
    else:
        if message:
            print("The current message is:", message)
        else:
            print("There is no message.")

別のオプションは、ローカル変数に固執することですが、プログラムのロジックはすべて同じ関数内に保持します。つまり、ユーザーが複数のエントリを作成できるようにする場合は、それらを含めるために関数内にループを作成する必要があります。これがどのように見えるかを次に示します。

def BBS():
   message = None # local variable

   while True: # loop until break
       if foo():
           message = input("Enter a message: ")
        elif bar():
            if message:
                print("The current message is:", message)
            else:
                print("There is no message.")
        else:
            print("Goodbye!")
            break

最後の、より複雑な (ただし、より永続的でスケーラブルな) オプションは、プログラムの外部にあるものを使用してメッセージを保存することです。これにより、プログラムの実行間で永続化され、異なるユーザーが異なる時間に表示される可能性があります。本格的なシステムの場合はデータベースをお勧めしますが、「おもちゃ」のシステムの場合は、おそらく単純なテキスト ファイルで問題を解決できます。その例を次に示します。

def BBS():
    if foo():
        with open("message.txt", "w") as f:
            message = input("Enter a message: ")
            f.write(message)
    else:
        try:
            with open("message.txt", "r") as f:
                message = f.read()
                print("The current message is:", message)
        except (FileNotFoundError, OSError):
            print("There is no message.")
于 2013-03-29T17:20:51.993 に答える