これは、なぜこれが機能しないのか疑問に思っているだけです。より良い方法を見つけましたが、以前は機能しなかった理由がわかりません。
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
したがって、誰かがチャット ハローに投稿すると、ボットはハロー! を返信します。