2016-01-05 1 views
2

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

def a(): 

И нажмите возвращение, команда не будет оцениваться. Затем он будет оценивать весь блок, как только я закончу его ввод за строкой.

Как известно оболочке python, когда она не должна обрабатывать заданный вход (строка)? Является ли это особенностью python (т. Е. Python может сказать, когда строка кода не завершена) или особенность самой оболочки (на основе regexp, т.е. когда строка заканчивается в двоеточии, ждать большего ввода)?

И как я могу воспроизвести это поведение с помощью python C api? Если я использую метод runSimpleString, он попытается выполнить любой заданный текст, поэтому я не могу реплицировать эту функцию «ожидать большего ввода», которую имеет обычная оболочка python

+0

Вы можете увидеть исходный код для интерактивного интерпретатора в [code.py] (https://github.com/python/cpython/blob/master/Lib/code.py) и [codeop.py] (https : //github.com/python/cpython/blob/master/Lib/codeop.py). –

+0

Спасибо, что очень полезно! Однако как это работает? Я вижу, что python пытается перекомпилировать код при добавлении 1 или 2 строк в случае сбоя и улавливает исключения SyntaxError, но я все равно не получаю его – lezebulon

ответ

1

Хотя я не смотрел исходный код для Python интерпретатор, я могу рассказать вам, как это возможно.

Это не будет функцией терминала (Windows Command Prompt/bash/other), поскольку вы уже используете интерпретатор Python в качестве программы, а эмуляторы терминалов слишком сильно меняются в реализации, чтобы полагаться на них. Еще одним доказательством, что это не является функцией терминала является >>> подсказка, что вы видите, когда вы запускаете Python, не то, что обычная командная строка $ или > и т.д.

Регулярные выражения также не достаточно, чтобы сказать, является ли конец кода был достигнут, потому что язык (Python) слишком сложный для RegEx. Abstract Syntax Tree (AST) должен использоваться для определения (почти достаточно, в любом случае) того, завершен ли код.

Таким образом, интерпретатор Python должен быть автономной программой, написанной таким образом, чтобы она использовала AST для синтаксического анализа данного ввода, а затем оценивала программу как Python, когда было определено, что код достаточно для того, чтобы попытка выполнения.

+0

спасибо! Но я не уверен, что он может работать таким образом: из того, что я понял, какой-либо оболочки python или IDE, такой как Idle, просто переадресует вызовы API python для выполнения реального кода на Python. Это означало бы, что программное обеспечение Idle, например, потребовало бы, чтобы полный синтаксический синтаксический анализатор python был встроен, без каких-либо иных целей, чем проверка, если данная строка является полным заявлением или нет? – lezebulon

+0

Вы правы, повторение такого кода было бы непрактичным. Я ожидаю, что есть некоторый интерфейс, встроенный в код Python, для доступа к парсеру. –

Смежные вопросы