Python и парсинг сообщения IRC

Думайте о интерпретаторе как о эмуляторе для машины, которой у вас нет

Короткий ответ: скомпилированные языки выполняются машинными инструкциями, а интерпретируемые - программой (пишутся на скомпилированном языке), который читает либо исходный код, либо байт-код, а затем, по существу, эмулирует гипотетическую машину, которая могла бы запустить программу напрямую, если бы машина существовала.

Думайте о интерпретируемой среде выполнения как о эмуляторе для машины, которой у вас на самом деле нет в данный момент.

Это очевидно усложняется компиляторами JIT (Just In Time), которые есть в Java, C # и других. Теоретически они так же хороши, как и компиляторы «AOT» («в одно время»), но на практике эти языки работают медленнее и имеют недостатки, так как необходимо, чтобы компилятор занимал много памяти и времени во время выполнения программы. Но если вы скажете что-либо из этого здесь, на SO, будьте готовы привлечь бешеных защитников JIT, которые настаивают на том, что между JIT и AOT нет теоретической разницы. Если вы спросите их, работают ли Java и C # так же быстро, как C и C ++, они начнут оправдываться и немного успокоятся. : -)

Итак, C ++ полностью правил в играх, где всегда можно использовать максимальное количество доступных вычислений.

На настольных компьютерах и в Интернете задачи, ориентированные на информацию, часто выполняются языками с большей абстракцией или, по крайней мере, меньшей компиляцией, поскольку компьютеры работают очень быстро и проблемы не требуют больших вычислительных ресурсов, поэтому мы можем потратить некоторое время на такие задачи, как время выхода на рынок, производительность программистов, надежные безопасные для памяти среды, динамическая модульность и другие мощные инструменты.

6
задан Chris Dale 18 October 2009 в 16:00
поделиться

5 ответов

Посмотрите на реализацию Twisted http://twistedmatrix.com/

К сожалению, у меня нет времени, может быть, кто-то еще может вставить это здесь для вас.

Править

Что ж, я вернулся, и, как ни странно, его еще никто не вставил, так что вот оно:

http://twistedmatrix.com/trac/browser/trunk/twisted/words/protocols/irc.py#54

def parsemsg(s):
    """Breaks a message from an IRC server into its prefix, command, and arguments.
    """
    prefix = ''
    trailing = []
    if not s:
       raise IRCBadMessage("Empty line.")
    if s[0] == ':':
        prefix, s = s[1:].split(' ', 1)
    if s.find(' :') != -1:
        s, trailing = s.split(' :', 1)
        args = s.split()
        args.append(trailing)
    else:
        args = s.split()
    command = args.pop(0)
    return prefix, command, args

parsemsg(":test!~test@test.com PRIVMSG #channel :Hi!")
# ('test!~test@test.com', 'PRIVMSG', ['#channel', 'Hi!']) 

Эта функция полностью соответствует EBNF, описанной в IRC RFC.

16
ответ дан 8 December 2019 в 13:48
поделиться

Вы можете сделать это с помощью простого понимания списка, если формат всегда такой.

keys = ['sender', 'type', 'target', 'message']
s = ":test!~test@test.com PRIVMSG #channel :Hi!"
dict((key, value.lstrip(':')) for key, value in zip(keys, s.split()))

Результат:

{'message': 'Hi!', 'type': 'PRIVMSG', 'sender': 'test!~test@test.com', 'target': '#channel'}
1
ответ дан 8 December 2019 в 13:48
поделиться

Вы просто хотите анализировать сообщения IRC в целом или хотите просто анализировать сообщения PRIVMSG ? Однако у меня есть реализация для этого.

def parse_message(s):
    prefix   = ''
    trailing = ''
    if s.startswith(':'):
        prefix, s = s[1:].split(' ', 1)
    if ' :' in s:
        s, trailing = s.split(' :', 1)
    args = s.split()
    return prefix, args.pop(0), args, trailing
0
ответ дан 8 December 2019 в 13:48
поделиться

Если вы хотите придерживаться низкоуровневого взлома, я второй ответ Неизвестного Twisted, но сначала я думаю, вам следует взглянуть на недавно анонсированный Yardbird который является хорошим слоем парсинга запросов поверх Twisted. Он позволяет вам использовать что-то подобное диспетчеризации URL-адресов Django для обработки сообщений IRC с дополнительным преимуществом наличия Django ORM для генерации ответов и т. Д.

0
ответ дан 8 December 2019 в 13:48
поделиться

Я знаю, что это не Python, но для подхода к этой проблеме, основанного на регулярных выражениях, вы можете взглянуть на POE :: Filter: : IRCD , который обрабатывает протокол сервера IRC (см. POE :: Filter :: IRC :: Compat для добавления клиентских протоколов) синтаксический анализ для Perl POE :: Component :: IRC фреймворк.

0
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: