# 9. Компоненти верхнього рівня

Інтерпретатор Python може отримувати вхідні дані з кількох джерел: зі сценарію, переданого йому як стандартний ввід, або як аргумент програми, введений інтерактивно, з вихідного файлу модуля тощо. У цій главі наведено синтаксис, який використовується в цих випадках.

## 9.1. Повні програми на Python

Хоча в специфікації мови не обов’язково вказувати, як викликається інтерпретатор мови, корисно мати уявлення про повну програму Python. Повна програма Python виконується в мінімально ініціалізованому середовищі: усі вбудовані та стандартні модулі доступні, але жоден не ініціалізований, за винятком `sys` (різні системні служби), `builtins` (вбудований -in функції, винятки та `None`) і `__main__`. Останній використовується для надання локального та глобального простору імен для виконання повної програми.

Синтаксис повної програми на Python такий же, як і для введення файлів, описаний у наступному розділі.

Інтерпретатор також може бути викликаний в інтерактивному режимі; в цьому випадку він не читає і не виконує повну програму, а читає і виконує один оператор (можливо, складений) за раз. Початкове середовище ідентично повній програмі; кожен оператор виконується в просторі імен `__main__`.

Повну програму можна передати інтерпретатору в трьох формах: за допомогою параметра командного рядка `-c` string, як файл, переданий як перший аргумент командного рядка, або як стандартний ввід. Якщо файл або стандартний вхід є пристроєм tty, інтерпретатор переходить в інтерактивний режим; інакше він виконує файл як повну програму.

## 9.2. Введення файлу

Усі вхідні дані, зчитані з неінтерактивних файлів, мають однакову форму:

    file_input ::=  (NEWLINE | statement)*

Цей синтаксис використовується в таких ситуаціях:

- при розборі повної програми Python (з файлу або з рядка);

- при розборі модуля;

- під час аналізу рядка, переданого функції `exec()`;

## 9.3. Інтерактивне введення

Введення в інтерактивному режимі аналізується за такою граматикою:

    interactive_input ::=  [stmt_list] NEWLINE | compound_stmt NEWLINE

Зауважте, що в інтерактивному режимі після складеного оператора (вищого рівня) має йти порожній рядок; це потрібно, щоб допомогти аналізатору визначити кінець введення.

## 9.4. Введення виразу

`eval()` використовується для введення виразу. Він ігнорує початкові пробіли. Рядковий аргумент `eval()` повинен мати такий вигляд:

    eval_input ::=  expression_list NEWLINE*