4

これは、なぜこれが機能しないのか疑問に思っているだけです。より良い方法を見つけましたが、以前は機能しなかった理由がわかりません。

global mydict
mydict = {}

これは問題なく動作するようで、mydict ディクショナリがグローバルになりました。mydict を印刷しても機能します。ただし、これを行う:

global bool
bool = False

動作しないようです。コードで bool を出力しようとすると、次のようになります。

UnboundLocalError: local variable 'bool' referenced before assignment

では、ブール値ではなく辞書で機能するのはなぜですか?

ああ、また、私がより良い方法をどのように見つけ出したのか疑問に思っている人がいれば、次のようにしてクラスを初期化し、クラスで bool をグローバルにしました: self.bool = False が機能しました。私はこの質問からそれを得ました: Making all variables global


編集:要求に応じて、必要なコードを投稿します:

import chatbot
global mydict
mydict = {}
global haveamessage
haveamessage = False

class MyBot(chatbot.ChatBot):
    def __init__(self, username, password, site):
        chatbot.ChatBot.__init__(self,username,password,site)

    def on_message(self, c, e):
        print mydict
        print haveamessage

if __name__ == '__main__':
    bot = MyBot("MyUsername", "MyPassword", "MySite")
    bot.start()

このコードを説明してみます。チャットボット モジュールのほとんどは、Wikia の Wiki でユーザーがボットを作成できるようにすることです。Wikia は、誰でも編集できる Wiki を作成できるようにする会社です。Wiki には、ユーザーが会話できるチャット拡張機能があります。このスクリプトにより、ボットはチャットに参加してコマンドを実行できます。on_message() は、誰かがチャットに投稿するとオフになります。

したがって、これは次のように出力されます。

{}
Traceback (most recent call last):
  File "file.py", line 146, in <module>
    bot.start()
  File "/Library/Python/2.7/site-packages/chatbot.py", line 371, in start
    self.on_message(self.c, e)
  File "file.py", line 12, in on_message
    print haveamessage
UnboundLocalError: local variable 'haveamessage' referenced before assignment

これでエラーが発生しない理由は、Wikia チャットに参加していないためであることを明確にしたいと思います。関数 on_message() は、誰かがチャットに何かを投稿したときにのみ実行されます。たとえば、次のようなことがあります。

def on_message(self, c, e):
    if e.text == 'hello': # e.text is what a user posts in the chat. e = event
        c.send('Hello!') # c.send simply sends back a message in the chat. c = connection

したがって、誰かがチャット ハローに投稿すると、ボットはハロー! を返信します。

4

2 に答える 2

6

あなたが投稿したコードは、あなたが主張するエラーを生成しません。ただしglobal、関数の外でキーワードを使用しても効果がないため、期待どおりに機能しないのは当然です。

haveamessage実際のコードでは、実際に内部に割り当てようとしていると思いますon_message。その場合、globalそのメソッド内にステートメントが必要です。

基本的なルールは次のとおりです。関数内からグローバル変数を割り当てようとする場合は、globalその関数内でキーワードを使用する必要があります。globalそれ以外の場合は、キーワードはまったく必要ありません。変数がブール値であるかどうかは関係ありません。

于 2013-01-20T01:42:00.477 に答える
0

あなたがやりたいのはグローバル変数を定義することだと思いますが、関数でそれらを参照して、ローカルで使用できるようにします。

import chatbot
mydict = {}
haveamessage = False

class MyBot(chatbot.ChatBot):
    def __init__(self, username, password, site):
        chatbot.ChatBot.__init__(self,username,password,site)

    def on_message(self, c, e):
        global mydict
        global haveamessage
        print mydict
        print haveamessage
于 2013-01-20T01:41:35.703 に答える