Как реализовать Python REPL, который приятно обрабатывает асинхронный вывод?

Вы не используете понятия. В концептуальном мире конструктор span будет выглядеть так с синтаксисом concept-ts:

struct span{
   span(const ContiguousRange&);
   span(ContiguousRange&);
   span(const span&) =default;
   span(span&) =default;
   };

или с c ++ 20:

struct span{
   span(const ContiguousRange auto&);
   span(ContiguousRange auto&);
   span(const span&) =default;
   span(span&) =default;
   };

Понятия здесь для облегчения абстракции. Так что если ваш интерфейс становится более сложным при использовании концепций, то вы пропустили абстракцию. Абстракция здесь ContiguousRange (спасибо @Lyberta).

12
задан 4 revs, 2 users 100% 19 January 2009 в 19:03
поделиться

4 ответа

Возможно, что-то вроде этого добьется цели:

#!/usr/bin/env python2.6

from __future__ import print_function

import readline
import threading

PROMPT = '> '

def interrupt():
    print() # Don't want to end up on the same line the user is typing on.
    print('Interrupting cow -- moo!')
    print(PROMPT, readline.get_line_buffer(), sep='', end='')

def cli():
    while True:
        cli = str(raw_input(PROMPT))

if __name__ == '__main__':
    threading.Thread(target=cli).start()
    threading.Timer(2, interrupt).start()

Я не думаю, что stdin ориентирован на многопотоковое исполнение, таким образом, можно закончить тем, что теряли символы потоку прерывания (который пользователь должен будет перепечатать в конце interrupt). Я преувеличил сумму interrupt время с time.sleep звонить. readline.get_line_buffer вызов не отобразит символы, которые теряются, таким образом, все это оказывается в порядке.

Обратите внимание, что сам stdout не ориентирован на многопотоковое исполнение, поэтому если у Вас есть несколько потоков прерывания выполнения, это может все еще закончить тем, что выглядело грубым.

8
ответ дан 2 December 2019 в 21:24
поделиться

Почему Вы пишете свое собственное использование REPL raw_input()? Вы посмотрели на cmd.Cmd класс?Править: Я просто нашел sclapp библиотеку, которая может также быть полезной.

Примечание: cmd.Cmd класс (и sclapp) может или не может непосредственно поддерживать Вашу исходную цель; Вам, вероятно, придется разделить его на подклассы и изменить его по мере необходимости для обеспечения той функции.

5
ответ дан 2 December 2019 в 21:24
поделиться

Это - своего рода неответ, но я посмотрел бы на код IPYTHON, чтобы видеть, как они делают его.

-1
ответ дан 2 December 2019 в 21:24
поделиться

Я думаю, что у Вас есть 2 основных опции:

  1. Синхронизируйте свой вывод (т.е. блок, пока он не возвратится),
  2. Разделите свой вход и свой (асинхронный) вывод, возможно, в двух отдельных столбцах.
-1
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

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