Преобразование строк и форматирование¶String conversion and formatting
Функции для преобразования чисел и форматированного вывода строк.
-
int PyOS_snprintf(char *str, size_t size, const char *format, ...)¶
- Часть Stable ABI.
Выводит не более size байт в str в соответствии со строкой формата format и дополнительными аргументами. См. справочную страницу Unix snprintf(3).
-
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)¶
- Часть Stable ABI.
Выводит не более size байт в str в соответствии со строкой формата format и со списком переменных аргументов va. Справочная страница Unix vsnprintf(3).
PyOS_snprintf() и PyOS_vsnprintf() оборачивают функции стандартной библиотеки C
snprintf() и vsnprintf(). Их задача – гарантировать согласованное поведение в граничных случаях, чего не обеспечивают стандартные функции C.
Обёртки гарантируют, что str[size-1] всегда будет '\0' после возврата. Они никогда не записывают в str более size байт (включая завершающий '\0'). Обе функции требуют, чтобы str != NULL, size > 0, format != NULL
и size < INT_MAX. Обратите внимание, что это означает отсутствие эквивалента функции C99
n = snprintf(NULL, 0, ...), которая определяла бы необходимый размер буфера.
Возвращаемое значение (rv) для этих функций следует интерпретировать следующим образом:
Если
0 <= rv < size, преобразование выполнено успешно, и rv символов записано в str (за исключением завершающего байта'\0'по адресуstr[rv]).Если
rv >= size, преобразование было усечено, и для успешного выполнения потребовался бы буфер размеромrv + 1байт. В этом случаеstr[size-1]равно'\0'.Если
rv < 0, «произошла ошибка».str[size-1]в этом случае тоже'\0', но остальная часть str не определена. Точная причина ошибки зависит от базовой платформы.
Следующие функции предоставляют преобразование строк в числа, не зависящее от локали.
-
unsigned long PyOS_strtoul(const char *str, char **ptr, int base)¶
- Часть Stable ABI.
Преобразует начальную часть строки из
strв значение unsigned long в соответствии с заданнымbase, которое должно быть между2и36включительно, или быть специальным значением0.Начальные пробелы и регистр символов игнорируются. Если
baseравно нулю, функция ищет начальные0b,0oили0x, чтобы определить основание. Если они отсутствуют, по умолчанию используется10. Основание должно быть 0 или от 2 до 36 (включительно). Еслиptrне равноNULL, оно будет содержать указатель на конец разбора.Если преобразованное значение выходит за пределы соответствующего типа возврата, возникает ошибка диапазона (
errnoустанавливается вERANGE) и возвращаетсяULONG_MAX. Если преобразование невозможно, возвращается0.См. также справочную страницу Unix strtoul(3).
Новое в версии 3.2.
-
long PyOS_strtol(const char *str, char **ptr, int base)¶
- Часть Stable ABI.
Преобразует начальную часть строки из
strв значение long в соответствии с заданнымbase, которое должно быть между2и36включительно, или быть специальным значением0.То же, что
PyOS_strtoul(), но возвращает значение long иLONG_MAXпри переполнении.См. также справочную страницу Unix strtol(3).
Новое в версии 3.2.
-
double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)¶
- Часть Stable ABI.
Преобразует строку
sв значение double, возбуждая исключение Python при неудаче. Множество допустимых строк соответствует строкам, принимаемым конструктором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_double_to_string(double val, char format_code, int precision, int flags, int *ptype)¶
- Часть Stable ABI.
Преобразует double val в строку, используя переданные format_code, precision и flags.
format_code должен быть одним из
'e','E','f','F','g','G'или'r'. Для'r'переданная precision должна быть равна 0 и игнорируется. Код формата'r'задаёт стандартный формат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()'#'для подробностей.
Если ptype не равно
NULL, то значение, на которое он указывает, будет установлено в одно изPy_DTST_FINITE,Py_DTST_INFINITEилиPy_DTST_NAN, что означает, что val является конечным числом, бесконечностью или не числом соответственно.Возвращаемое значение – указатель на buffer с преобразованной строкой или
NULL, если преобразование не удалось. Вызывающий отвечает за освобождение возвращённой строки с помощью вызоваPyMem_Free().Новое в версии 3.1.
-
int PyOS_stricmp(const char *s1, const char *s2)¶
Сравнение строк без учёта регистра. Функция работает почти идентично
strcmp(), за исключением того, что игнорирует регистр.
-
int PyOS_strnicmp(const char *s1, const char *s2, Py_ssize_t size)¶
Сравнение строк без учёта регистра. Функция работает почти идентично
strncmp(), за исключением того, что игнорирует регистр.