# `code` — Interpreter base classes

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

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

class code.InteractiveInterpreter(locals=None)

  This class deals with parsing and interpreter state (the user’s namespace); it does not deal with input buffering or prompting or input file naming (the filename is always passed in explicitly). The optional locals argument specifies the dictionary in which code will be executed; it defaults to a newly created dictionary with key `'__name__'` set to `'__console__'` and key `'__doc__'` set to `None`.

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

  Closely emulate the behavior of the interactive Python interpreter. This class builds on `InteractiveInterpreter` and adds prompting using the familiar `sys.ps1` and `sys.ps2`, and input buffering.

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`; підклас може замінити це іншою реалізацією.