Алгоритм Python используется для выбора между >>> и ... приглашение в интерактивной консоли? - PullRequest
3 голосов
/ 12 ноября 2010

Я реализую пользовательскую (железную) консоль Python.

Мне нужно отобразить приглашение >>> в целом, но когда утверждение неполное, мне нужно изменить приглашение на ...и собирать больше строк перед их выполнением.

Как узнать, завершена ли введенная пользователем строка или мне нужно прочитать больше строк?

Кажется, простой способ проверить,: присутствует.Но я не уверен, не пропускаю ли я другие случаи, когда : отсутствует.

Я изучил исходный код IronPython, чтобы понять, как он это делает, но в нем много шагов, и мойПростое воспроизведение не работает полностью.

Ответы [ 4 ]

4 голосов
/ 12 ноября 2010

Непрактично пытаться угадать, просто посмотрев строку кода для двоеточий и скобок. В конечном итоге вам понадобится реализовать половину парсера Python, чтобы получить это право.

Модуль стандартной библиотеки code воспроизводит поведение интерактивного интерпретатора Python, и я считаю, что именно этот модуль использует IronPython для реализации своей консоли. (CPython 1 не реализован в самом Python.)

Интересующая вас логика продолжения строки взята из функции codeop.compile_command .

Это что-то вроде хака. По сути, он пытается compile() данный код, используя скрытый флаг PyCF_DONT_IMPLY_DEDENT, что означает, что он не предполагает, что открытые отступы закрываются автоматически в конце блока. Затем он пытается скомпилировать его снова с добавлением новых строк (вызывая явные DEDENTs). Если второе работает, но первое - нет, у вас есть потенциальное продолжение, в блок можно ввести еще больше.

3 голосов
/ 12 ноября 2010

Есть несколько способов получения приглашения ....

  • Начало (или продолжение) блока
    • def foo():
  • Незакрытые скобки, скобка, квадратная скобка
    • x = (
    • x = {
    • x = [
  • Незакрытая строка в тройных кавычках
    • x = '''
  • Обратная косая черта в конце строки:
    • x = \
3 голосов
/ 12 ноября 2010

Цикл repl обладает полным знанием и доступом к парсеру. Если состояние синтаксического анализатора таково, что оно ожидает чего-то другого, кроме оператора, тогда цикл repl выдает .... В случае закрытых скобок оператор будет недопустимым на следующей строке, потому что нет никакого возможного подвыражения, которое может содержать оператор. После : следующий ожидаемый токен всегда является отступом, еще раз утверждение всегда будет недопустимым. Вот почему всегда необходимо вводить пустую строку в конце блока с отступом в цикле repl, потому что вы должны предоставить закрывающий отступ, чтобы оператор стал следующим ожидаемым рабочим правилом.

1 голос
/ 12 ноября 2010

Использовали ли вы : или \ (или незамкнутый разделитель, например скобки или скобки)? Интерактивный переводчик показывает ....

Фактическая логика может быть немного сложнее, но это основное правило.

...