【问题标题】:Callbacks and events in pythonpython中的回调和事件
【发布时间】:2013-06-24 11:10:42
【问题描述】:

我正在制作一个将 IRC 和 DC(直接连接)链接在一起的机器人。我一直在关注 C++ 中的现有实现,但它没有我们所追求的所有功能。

我正在为 python 使用一个 IRC 库,它的代码非常好。我可以为各种 IRC 事件(特别是接收公共消息)注册一些回调处理程序。此回调函数能够从 IRC 库中的线程引用在主要 python 执行中创建的对象。

这是我的回调:

def on_connect(connection, event):
    connection.join(ircSettings['channel'])

def on_disconnect(connection, event):
    sys.exit()

def on_pubmsg(connection, event):
    hubClient.sendMessage(event.source.split('!')[0] + ': ' + event.arguments[0])

我是这样设置它们的:

# Create the IRC client
ircClient = irc.client.IRC()
try:
    ircConnection = ircClient.server().connect(ircSettings['server'], ircSettin$
except irc.client.ServerConnectionError, x:
    print x
    sys.exit()

# Set the IRC event handlers
ircConnection.add_global_handler("welcome", on_connect)
ircConnection.add_global_handler("pubmsg", on_pubmsg)
ircConnection.add_global_handler("disconnect", on_disconnect)

我真的很喜欢这个解决方案,因为它使代码非常整洁(尤其是在这个例子中)。但是,我不知道如何修改我的 DC 库来生成这些事件。

主要的兴趣点是回调引用 hubClient 的能力,它是在 Python 主程序中创建的,如下所示:

# Create the DC client
hubClient = DC.DirectConnect(dcSettings)
hubClient.connect(dcSettings['hub'])

最初,我将一个函数指针传递给我的 DC 库,以便在收到消息时运行:

def messageHandler(nick, msg):
    if nick is not ircSettings['nick']:
        ircConnection.privmsg(ircSettings['channel'], nick + ': ' + msg)

dcSettings = {
    'nick': 'dans_bot',
    'sharesize': 10*1024**3, # 10GB
    'ip': '0.0.0.0', # XXX: This might not matter, but needed for library
    'hub': ('192.168.1.129', 411),
    'handler': messageHandler
}

但我得到了错误:

NameError: global name 'ircConnection' is not defined

如何设置我的 DC 客户端以创建回调,以便我仍然可以引用这些本地(主执行)对象?

编辑:我为“ircConnection”添加了一个声明。

【问题讨论】:

    标签: python events callback irc


    【解决方案1】:

    我想ircConnection 是第三方模块。并且对该模块的简单导入可以解决global nameircConnectionis not defined的这个错误。在主模块中尝试import ircConnection

    【讨论】:

      【解决方案2】:

      您的代码中唯一的问题是对ircConnection 的引用首先出现在try-except 块内,如果失败,则var 将为None。在尝试之前写ircConnection = None

      # Create the IRC client
      ircClient = irc.client.IRC()
      ircConnection = None 
      try:
          ircConnection = ircClient.server().connect(ircSettings['server'], ircSettin$
      except irc.client.ServerConnectionError, x:
          print x
          sys.exit()
      
      # Set the IRC event handlers
      ircConnection.add_global_handler("welcome", on_connect)
      ircConnection.add_global_handler("pubmsg", on_pubmsg)
      ircConnection.add_global_handler("disconnect", on_disconnect)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多