code — Базові класи інтерпретатора

Вихідний код: Lib/code.py


Модуль code надає засоби для реалізації циклів читання-оцінки-друку в Python. Включено два класи та додаткові функції, які можна використовувати для створення програм, які надають інтерактивну підказку інтерпретатора.

class code.InteractiveInterpreter(locals=None)

Цей клас займається аналізом та станом інтерпретатора (простір імен користувача); він не стосується буферизації вхідних даних, підказок або іменування вхідних файлів (назва файлу завжди передається явно). Необов’язковий аргумент locals визначає словник, у якому виконуватиметься код; за замовчуванням він використовує щойно створений словник із ключем '__name__'', встановленим на '__console__'', і ключем '__doc__'', встановленим на None.

class code.InteractiveConsole(locals=None, filename='<console>')

Наслідуйте поведінку інтерактивного інтерпретатора Python. Цей клас базується на InteractiveInterpreter і додає підказки за допомогою знайомих sys.ps1 і sys.ps2, а також буферизацію введення.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None)

Convenience function to run a read-eval-print loop. This creates a new instance of InteractiveConsole and sets readfunc to be used as the InteractiveConsole.raw_input() method, if provided. If local is provided, it is passed to the InteractiveConsole constructor for use as the default namespace for the interpreter loop. The interact() method of the instance is then run with banner and exitmsg passed as the banner and exit message to use, if provided. The console object is discarded after use.

Змінено в версії 3.6: Додано параметр exitmsg.

code.compile_command(source, filename='<input>', symbol='single')

Ця функція корисна для програм, які хочуть емулювати основний цикл інтерпретатора Python (він же цикл читання-оцінки-друку). Складна частина полягає в тому, щоб визначити, коли користувач ввів неповну команду, яку можна завершити введенням додаткового тексту (на відміну від повної команди чи синтаксичної помилки). Ця функція майже завжди приймає те саме рішення, що й основний цикл реального інтерпретатора.

джерело - вихідний рядок; ім’я файлу — необов’язкове ім’я файлу, з якого було прочитано джерело, за умовчанням ' <input> ''; і symbol є необов’язковим символом початку граматики, який має бути 'single' (за замовчуванням), 'eval' або 'exec'.

Повертає об’єкт коду (те саме, що compile(source, filename, symbol)), якщо команда повна та дійсна; None, якщо команда неповна; викликає SyntaxError, якщо команда завершена та містить синтаксичну помилку, або викликає OverflowError або ValueError, якщо команда містить недійсний літерал.

Об’єкти інтерактивного інтерпретатора

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

Скомпілюйте та запустіть деяке джерело в інтерпретаторі. Аргументи такі самі, як і для compile_command(); за замовчуванням для ім’я файлу є ' <input> '', а для symbol'single'. Може статися одне з кількох:

  • Введено неправильно; compile_command() викликала виняток (SyntaxError або OverflowError). Відстеження синтаксису буде надруковано викликом методу showsyntaxerror(). runsource() повертає False.

  • Вхідні дані неповні, потрібні додаткові дані; compile_command() повернула None. runsource() повертає True.

  • Введення завершено; compile_command() повернув об’єкт коду. Код виконується шляхом виклику runcode() (який також обробляє винятки під час виконання, за винятком SystemExit). runsource() повертає False.

Значення, що повертається, можна використовувати, щоб вирішити, чи використовувати sys.ps1 або sys.ps2 для підказки наступного рядка.

InteractiveInterpreter.runcode(code)

Виконати об’єкт коду. Коли виникає виняткова ситуація, showtraceback() викликається для відображення зворотного відстеження. Перехоплюються всі винятки, крім SystemExit, якому дозволено поширюватися.

Примітка про KeyboardInterrupt: цей виняток може виникнути в іншому місці цього коду та не завжди може бути перехоплений. Той, хто дзвонить, повинен бути готовим до цього.

InteractiveInterpreter.showsyntaxerror(filename=None)

Відобразити синтаксичну помилку, яка щойно сталася. Це не відображає трасування стека, оскільки немає трасування синтаксичних помилок. Якщо вказано filename, воно вставляється у виняток замість назви файлу за замовчуванням, наданої синтаксичним аналізатором Python, оскільки він завжди використовує ' <string> '' під час читання з рядка. Вихід записується методом write().

InteractiveInterpreter.showtraceback()

Відобразити виняток, який щойно стався. Ми видаляємо перший елемент стеку, оскільки він знаходиться в межах реалізації об’єкта інтерпретатора. Вихід записується методом write().

Змінено в версії 3.5: Відображається повна ланцюгова трасування, а не лише основна трасування.

InteractiveInterpreter.write(data)

Запишіть рядок у стандартний потік помилок (sys.stderr). Похідні класи повинні замінити це, щоб забезпечити відповідну обробку виводу за потреби.

Інтерактивні консольні об’єкти

Клас InteractiveConsole є підкласом InteractiveInterpreter, тому пропонує всі методи об’єктів інтерпретатора, а також наступні доповнення.

InteractiveConsole.interact(banner=None, exitmsg=None)

Повністю емулюйте інтерактивну консоль Python. Необов’язковий аргумент banner визначає банер для друку перед першою взаємодією; за замовчуванням він друкує банер, подібний до того, який друкує стандартний інтерпретатор Python, а потім ім’я класу консольного об’єкта в дужках (щоб не сплутати це зі справжнім інтерпретатором, оскільки він дуже близький!).

Необов’язковий аргумент exitmsg визначає повідомлення про вихід, яке друкується під час виходу. Передайте порожній рядок, щоб приховати повідомлення про вихід. Якщо exitmsg не вказано або None, буде надруковано повідомлення за замовчуванням.

Змінено в версії 3.4: Щоб заборонити друк будь-якого банера, передайте порожній рядок.

Змінено в версії 3.6: Друк повідомлення про вихід під час виходу.

InteractiveConsole.push(line)

Push a line of source text to the interpreter. The line should not have a trailing newline; it may have internal newlines. The line is appended to a buffer and the interpreter’s runsource() method is called with the concatenated contents of the buffer as source. If this indicates that the command was executed or invalid, the buffer is reset; otherwise, the command is incomplete, and the buffer is left as it was after the line was appended. The return value is True if more input is required, False if the line was dealt with in some way (this is the same as runsource()).

InteractiveConsole.resetbuffer()

Видаліть будь-який необроблений вихідний текст із вхідного буфера.

InteractiveConsole.raw_input(prompt='')

Напишіть підказку та прочитайте рядок. Повернений рядок не містить кінцевого символу нового рядка. Коли користувач вводить послідовність клавіш EOF, виникає EOFError. Базова реалізація читає з sys.stdin; підклас може замінити це іншою реалізацією.