> **Источник:** https://python-all.ru/3.14/c-api/curses.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# C API для curses

[`curses`](https://python-all.ru/3.14/library/curses.html#module-curses) предоставляет небольшой C-интерфейс для модулей расширения. Потребители должны включать заголовочный файл `py_curses.h` (который по умолчанию не включается `Python.h`), а [`import_curses()`](https://python-all.ru/3.14/c-api/curses.html#c.import_curses) должна вызываться, обычно как часть функции инициализации модуля, для заполнения [`PyCurses_API`](https://python-all.ru/3.14/c-api/curses.html#c.PyCurses_API).

> **Предупреждение**
>
> Ни C API, ни чистый Python-модуль [`curses`](https://python-all.ru/3.14/library/curses.html#module-curses) не совместимы с субинтерпретаторами.

#### `import_curses()`

Импортирует curses C API. Для вызова макроса не требуется точка с запятой.

При успехе заполняет указатель [`PyCurses_API`](https://python-all.ru/3.14/c-api/curses.html#c.PyCurses_API).

При ошибке устанавливает [`PyCurses_API`](https://python-all.ru/3.14/c-api/curses.html#c.PyCurses_API) в NULL и устанавливает исключение. Вызывающий код должен проверить, произошла ли ошибка, с помощью [`PyErr_Occurred()`](https://python-all.ru/3.14/c-api/exceptions.html#c.PyErr_Occurred):

```c
import_curses();  // точка с запятой необязательна, но рекомендуется
if (PyErr_Occurred()) { /* очистка */ }
```

#### `void **PyCurses_API`

Динамически размещаемый объект, содержащий curses C API. Эта переменная доступна только после успешного выполнения [`import_curses`](https://python-all.ru/3.14/c-api/curses.html#c.import_curses).

`PyCurses_API[0]` соответствует [`PyCursesWindow_Type`](https://python-all.ru/3.14/c-api/curses.html#c.PyCursesWindow_Type).

`PyCurses_API[1]`, `PyCurses_API[2]` и `PyCurses_API[3]` – указатели на функции-предикаты типа `int (*)(void)`.

При вызове эти предикаты возвращают, были ли вызваны [`curses.setupterm()`](https://python-all.ru/3.14/library/curses.html#curses.setupterm), [`curses.initscr()`](https://python-all.ru/3.14/library/curses.html#curses.initscr) и [`curses.start_color()`](https://python-all.ru/3.14/library/curses.html#curses.start_color) соответственно.

Смотрите также вспомогательные макросы [`PyCursesSetupTermCalled`](https://python-all.ru/3.14/c-api/curses.html#c.PyCursesSetupTermCalled), [`PyCursesInitialised`](https://python-all.ru/3.14/c-api/curses.html#c.PyCursesInitialised) и [`PyCursesInitialisedColor`](https://python-all.ru/3.14/c-api/curses.html#c.PyCursesInitialisedColor).

> **Примечание**
>
> Количество записей в этой структуре может изменяться. Рассмотрите использование [`PyCurses_API_pointers`](https://python-all.ru/3.14/c-api/curses.html#c.PyCurses_API_pointers) для проверки, доступны ли новые поля.

#### `PyCurses_API_pointers`

Количество доступных полей (`4`) в [`PyCurses_API`](https://python-all.ru/3.14/c-api/curses.html#c.PyCurses_API). Это число увеличивается при добавлении новых полей.

#### `PyTypeObject PyCursesWindow_Type`

[тип-куча](https://python-all.ru/3.14/c-api/typeobj.html#heap-types), соответствующий [`curses.window`](https://python-all.ru/3.14/library/curses.html#curses.window).

#### `int PyCursesWindow_Check(PyObject *op)`

Возвращает true, если *op* является экземпляром [`curses.window`](https://python-all.ru/3.14/library/curses.html#curses.window), и false в противном случае.

Следующие макросы являются вспомогательными макросами, разворачивающимися в C-инструкции. В частности, их можно использовать только как `macro;` или `macro`, но не как `macro()` или `macro();`.

#### `PyCursesSetupTermCalled`

Макрос, проверяющий, была ли вызвана [`curses.setupterm()`](https://python-all.ru/3.14/library/curses.html#curses.setupterm).

Развёрнутый макрос примерно эквивалентен:

```c
{
    typedef int (*predicate_t)(void);
    predicate_t was_setupterm_called = (predicate_t)PyCurses_API[1];
    if (!was_setupterm_called()) {
        return NULL;
    }
}
```

#### `PyCursesInitialised`

Макрос, проверяющий, была ли вызвана [`curses.initscr()`](https://python-all.ru/3.14/library/curses.html#curses.initscr).

Развёрнутый макрос примерно эквивалентен:

```c
{
    typedef int (*predicate_t)(void);
    predicate_t was_initscr_called = (predicate_t)PyCurses_API[2];
    if (!was_initscr_called()) {
        return NULL;
    }
}
```

#### `PyCursesInitialisedColor`

Макрос, проверяющий, была ли вызвана [`curses.start_color()`](https://python-all.ru/3.14/library/curses.html#curses.start_color).

Развёрнутый макрос примерно эквивалентен:

```c
{
    typedef int (*predicate_t)(void);
    predicate_t was_start_color_called = (predicate_t)PyCurses_API[3];
    if (!was_start_color_called()) {
        return NULL;
    }
}
```

# Внутренние данные

Следующие объекты предоставляются C API, но предназначены только для внутреннего использования.

#### `PyCurses_CAPSULE_NAME`

Имя капсулы curses, передаваемое в [`PyCapsule_Import()`](https://python-all.ru/3.14/c-api/capsule.html#c.PyCapsule_Import).

Только для внутреннего использования. Вместо этого используйте [`import_curses`](https://python-all.ru/3.14/c-api/curses.html#c.import_curses).
