conversion.md
1> **Источник:** https://python-all.ru/3.0/c-api/conversion.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Преобразование строк и форматирование89Функции для преобразования чисел и форматированного вывода строк.1011**\[PyOS\_snprintf\]int `PyOS_snprintf`(char *\*str*, size\_t *size*, const char *\*format*, ...)**1213Вывод не более1415*size*1617байт в1819*str*2021в соответствии со строкой форматирования2223*format*2425и дополнительными аргументами. См. справочную страницу Unix2627*snprintf(2)*2829.3031**\[PyOS\_vsnprintf\]int `PyOS_vsnprintf`(char *\*str*, size\_t *size*, const char *\*format*, va\_list *va*)**3233Вывод не более3435*size*3637байт в3839*str*4041в соответствии со строкой форматирования4243*format*4445и списком переменных аргументов4647*va*4849. Справочная страница Unix5051*vsnprintf(2)*5253.5455[`PyOS_snprintf`](https://python-all.ru/3.0/c-api/conversion.html#PyOS_snprintf) и [`PyOS_vsnprintf`](https://python-all.ru/3.0/c-api/conversion.html#PyOS_vsnprintf) оборачивают функции из стандартной библиотеки C `snprintf` и `vsnprintf`. Их цель – гарантировать постоянное поведение в граничных случаях, которое стандартные функции C не обеспечивают.5657Обёртки гарантируют, что *str\*\[\*size*-1\] всегда равен `'\0'` после возврата. Они никогда не записывают более *size* байт (включая завершающий `'\0'`) в str. Обе функции требуют, чтобы `str != NULL`, `size > 0` и `format != NULL`.5859Если платформа не имеет `vsnprintf` и размер буфера, необходимый для предотвращения усечения, превышает *size* более чем на 512 байт, Python аварийно завершает работу с *Py\_FatalError*.6061Возвращаемое значение (*rv*) для этих функций следует интерпретировать следующим образом:6263- Когда `0 <= rv < size`, преобразование вывода прошло успешно и в *str* было записано *rv* символов (исключая завершающий байт `'\0'` в *str\*\[\*rv*\]).64- Когда `rv >= size`, преобразование вывода было усечено и потребовался бы буфер размером `rv + 1` байт для успешного выполнения. *str\*\[\*size*-1\] равен `'\0'` в этом случае.65- Когда `rv < 0`, «произошло что-то плохое». *str\*\[\*size*-1\] равен `'\0'` и в этом случае, но остальная часть *str* не определена. Точная причина ошибки зависит от базовой платформы.6667Следующие функции предоставляют преобразование строк в числа, не зависящее от локали.6869**\[PyOS\_ascii\_strtod\]double `PyOS_ascii_strtod`(const char *\*nptr*, char *\*\*endptr*)**7071Преобразует строку в значение типа `double`. Эта функция ведёт себя как стандартная функция C `strtod` в локали C. Она делает это без изменения текущей локали, поскольку это было бы небезопасно для потоков.7273[`PyOS_ascii_strtod`](https://python-all.ru/3.0/c-api/conversion.html#PyOS_ascii_strtod) обычно следует использовать для чтения конфигурационных файлов или других данных, вводимых не пользователем, которые не должны зависеть от локали.7475Подробнее см. на странице руководства Unix *strtod(2)*.7677**\[PyOS\_ascii\_formatd\]char \* `PyOS_ascii_formatd`(char *\*buffer*, size\_t *buf\_len*, const char *\*format*, double *d*)**7879Преобразует значение `double` в строку, используя `'.'` в качестве десятичного разделителя. *format* – это строка формата в стиле `printf`, определяющая формат числа. Допустимые символы преобразования: `'e'`, `'E'`, `'f'`, `'F'`, `'g'` и `'G'`.8081Возвращаемое значение – указатель на *buffer* с преобразованной строкой или NULL, если преобразование не удалось.8283**\[PyOS\_ascii\_atof\]double `PyOS_ascii_atof`(const char *\*nptr*)**8485Преобразует строку в `double` способом, не зависящим от локали.8687Подробнее см. на странице руководства Unix *atof(2)*.8889**\[PyOS\_stricmp\]char \* `PyOS_stricmp`(char *\*s1*, char *\*s2*)**9091Сравнение строк без учёта регистра. Функция работает почти идентично9293`strcmp`9495, за исключением того, что она игнорирует регистр.9697**\[PyOS\_strnicmp\]char \* `PyOS_strnicmp`(char *\*s1*, char *\*s2*, Py\_ssize\_t *size*)**9899Сравнение строк без учёта регистра. Функция работает почти идентично100101`strncmp`102103, за исключением того, что она игнорирует регистр.104