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

---

# Преобразование строк и форматирование

Функции для преобразования чисел и форматированного вывода строк.

**int `PyOS_snprintf`(char *\*str*, size\_t *size*, const char *\*format*, ...)**

Вывод не более

*size*

байт в

*str*

в соответствии со строкой форматирования

*format*

и дополнительными аргументами. См. справочную страницу Unix

*snprintf(2)*

.

**int `PyOS_vsnprintf`(char *\*str*, size\_t *size*, const char *\*format*, va\_list *va*)**

Вывод не более

*size*

байт в

*str*

в соответствии со строкой форматирования

*format*

и списком переменных аргументов

*va*

. Справочная страница Unix

*vsnprintf(2)*

.

[`PyOS_snprintf()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_snprintf) и [`PyOS_vsnprintf()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_vsnprintf) оборачивают функции стандартной библиотеки C `snprintf()` и `vsnprintf()`. Их цель – гарантировать согласованное поведение в граничных случаях, в котором стандартные функции C не гарантируют.

Обёртки гарантируют, что *str\*\[\*size*-1\] всегда равен `'\0'` после возврата. Они никогда не записывают более *size* байт (включая завершающий `'\0'`) в str. Обе функции требуют, чтобы `str != NULL`, `size > 0` и `format != NULL`.

Если на платформе нет `vsnprintf()` и размер буфера, необходимый для предотвращения усечения, превышает *size* более чем на 512 байт, Python аварийно завершается с *Py\_FatalError*.

Возвращаемое значение (*rv*) для этих функций следует интерпретировать следующим образом:

- Когда `0 <= rv < size`, преобразование вывода прошло успешно и в *str* было записано *rv* символов (исключая завершающий байт `'\0'` в *str\*\[\*rv*\]).
- Когда `rv >= size`, преобразование вывода было усечено и потребовался бы буфер размером `rv + 1` байт для успешного выполнения. *str\*\[\*size*-1\] равен `'\0'` в этом случае.
- Когда `rv < 0`, «произошло что-то плохое». *str\*\[\*size*-1\] равен `'\0'` и в этом случае, но остальная часть *str* не определена. Точная причина ошибки зависит от базовой платформы.

Следующие функции предоставляют преобразование строк в числа, не зависящее от локали.

**double `PyOS_ascii_strtod`(const char *\*nptr*, char *\*\*endptr*)**

Преобразует строку в `double`. Эта функция ведёт себя как стандартная функция языка C `strtod()` в локали C. Она делает это без переключения текущей локали, так как это не было бы потокобезопасно.

[`PyOS_ascii_strtod()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_ascii_strtod) обычно следует использовать для чтения конфигурационных файлов или других входных данных, не вводимых пользователем, которые должны быть независимы от локали.

Подробнее см. на странице руководства Unix *strtod(2)*.

Устарело с версии 3.1: Вместо этого используйте [`PyOS_string_to_double()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_string_to_double).

**double `PyOS_string_to_double`(const char *\*s*, char *\*\*endptr*, [PyObject](https://python-all.ru/3.1/c-api/structures.html#PyObject) *\*overflow\_exception*)**

Преобразует строку `s` в `double`, возбуждая исключение Python при неудаче. Набор принимаемых строк соответствует набору строк, принимаемых конструктором [`float()`](https://python-all.ru/3.1/library/functions.html#float) в Python, за исключением того, что `s` не должна содержать начальных или конечных пробелов. Преобразование не зависит от текущей локали.

Если `endptr` равен `NULL`, преобразует всю строку. Возбуждает ValueError и возвращает `-1.0`, если строка не является корректным представлением числа с плавающей запятой.

Если endptr не равен `NULL`, преобразует максимально возможную часть строки и устанавливает `*endptr` так, чтобы он указывал на первый непреобразованный символ. Если ни один начальный сегмент строки не является корректным представлением числа с плавающей запятой, устанавливает `*endptr` так, чтобы он указывал на начало строки, возбуждает ValueError и возвращает `-1.0`.

Если `s` представляет значение, слишком большое для хранения в float (например, `"1e500"` является такой строкой на многих платформах), то если `overflow_exception` равен `NULL`, возвращает `Py_HUGE_VAL` (с соответствующим знаком) и не устанавливает никакого исключения. В противном случае `overflow_exception` должен указывать на объект исключения Python; возбуждает это исключение и возвращает `-1.0`. В обоих случаях устанавливает `*endptr` так, чтобы он указывал на первый символ после преобразованного значения.

Если во время преобразования возникает любая другая ошибка (например, ошибка нехватки памяти), устанавливает соответствующее исключение Python и возвращает `-1.0`.

Новое в версии 3.1.

**char\* `PyOS_ascii_formatd`(char *\*buffer*, size\_t *buf\_len*, const char *\*format*, double *d*)**

Преобразует `double` в строку, используя `'.'` в качестве десятичного разделителя. Параметр *format* – это строка формата в стиле `printf()`, задающая формат числа. Допустимые символы преобразования: `'e'`, `'E'`, `'f'`, `'F'`, `'g'` и `'G'`.

Возвращаемое значение – указатель на *buffer* с преобразованной строкой или NULL, если преобразование не удалось.

Устарело с версии 3.1: Вместо этого используйте [`PyOS_double_to_string()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_double_to_string).

**char\* `PyOS_double_to_string`(double *val*, char *format\_code*, int *precision*, int *flags*, int *\*ptype*)**

Преобразует `double` *val* в строку, используя переданные *format\_code*, *precision* и *flags*.

*format\_code* должен быть одним из `'e'`, `'E'`, `'f'`, `'F'`, `'g'`, `'G'` или `'r'`. Для `'r'` указанный *precision* должен быть 0 и игнорируется. Код формата `'r'` задаёт стандартный формат [`repr()`](https://python-all.ru/3.1/library/functions.html#repr).

*flags* может быть нулевым или содержать одно или несколько значений *Py\_DTSF\_SIGN*, *Py\_DTSF\_ADD\_DOT\_0* или *Py\_DTSF\_ALT*, объединённых по ИЛИ:

- *Py\_DTSF\_SIGN* означает, что возвращаемая строка всегда предваряется знаком, даже если *val* неотрицательно.
- *Py\_DTSF\_ADD\_DOT\_0* означает, что возвращаемая строка не должна выглядеть как целое число.
- *Py\_DTSF\_ALT* означает применение «альтернативных» правил форматирования. См. документацию по спецификатору [`PyOS_snprintf()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_snprintf) `'#'` для подробностей.

Если *ptype* не равен NULL, то значение, на которое он указывает, будет установлено в одно из *Py\_DTST\_FINITE*, *Py\_DTST\_INFINITE* или *Py\_DTST\_NAN*, что означает, что *val* является конечным числом, бесконечностью или не числом соответственно.

Возвращаемое значение – указатель на *buffer* с преобразованной строкой или *NULL*, если преобразование не удалось. Вызывающий обязан освободить возвращённую строку с помощью вызова [`PyMem_Free()`](https://python-all.ru/3.1/c-api/memory.html#PyMem_Free).

Новое в версии 3.1.

**double `PyOS_ascii_atof`(const char *\*nptr*)**

Преобразует строку в `double` способом, не зависящим от локали.

Подробнее см. на странице руководства Unix *atof(2)*.

Устарело с версии 3.1: Вместо этого используйте [`PyOS_string_to_double()`](https://python-all.ru/3.1/c-api/conversion.html#PyOS_string_to_double).

**char\* `PyOS_stricmp`(char *\*s1*, char *\*s2*)**

Сравнение строк без учёта регистра. Функция работает почти идентично

`strcmp()`

, за исключением того, что игнорирует регистр.

**char\* `PyOS_strnicmp`(char *\*s1*, char *\*s2*, Py\_ssize\_t *size*)**

Сравнение строк без учёта регистра. Функция работает почти идентично

`strncmp()`

, за исключением того, что игнорирует регистр.
