Обратни извиквания и събития в python

Правя бот за свързване на IRC и DC (директно свързване) заедно. Има съществуваща реализация в C++, която следя, но тя няма всички функции, които търсим.

Използвам IRC библиотека за python, която е наистина добре кодирана. Мога да регистрирам някои манипулатори за обратно извикване за различни IRC събития (по-специално получаване на публично съобщение). Тази функция за обратно извикване може да препраща към обекти, създадени в основното изпълнение на Python от нишката в IRC библиотеката.

Ето моите обратни обаждания:

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“.


person dantheman    schedule 24.06.2013    source източник


Отговори (2)


Предполагам, че ircConnection е модул на трета страна. И едно просто импортиране на този модул може да реши тази грешка на global nameircConnectionis not defined. Опитайте import ircConnection във вашия основен модул

person Nakamura    schedule 24.06.2013

Единственият проблем във вашия код е, че препратката към ircConnection първо се вижда вътре в блока try-except и ако не успее, тогава променливата ще бъде 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)
person David Hernandez    schedule 03.07.2016