字符串转换和格式化

用于数字转换和格式化字符串输出的函数。

int PyOS_snprintf(char *str, size_t size, const char *format, ...)
作为 稳定 ABI 的一部分。

根据格式字符串 format 和额外参数,输出不超过 size 字节到 str。请参阅 Unix 手册页 snprintf(3)

int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
作为 稳定 ABI 的一部分。

根据格式字符串 format 和可变参数列表 va,输出不超过 size 字节到 str。Unix 手册页 vsnprintf(3)

PyOS_snprintf()PyOS_vsnprintf() 封装了标准 C 库函数 snprintf()vsnprintf()。它们旨在保证在标准 C 函数无法保证的极端情况下的行为一致性。

这些封装函数确保返回时 str[size-1] 总是 '\0'。它们绝不会写入超过 size 字节(包括末尾的 '\0')到 str 中。两个函数都要求 str != NULL, size > 0, format != NULLsize < INT_MAX。请注意,这意味着没有 C99 n = snprintf(NULL, 0, ...) 等价物来确定所需的缓冲区大小。

这些函数的返回值 (rv) 应按以下方式解释:

  • 0 <= rv < size 时,输出转换成功,并将 rv 个字符写入 str(不包括 str[rv] 处的末尾 '\0' 字节)。

  • 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)
作为 稳定 ABI 的一部分。

根据给定的 base,将 str 中的字符串的初始部分转换为 unsigned long 值,base 必须在 236(含)之间,或者是一个特殊值 0

忽略前导空格和字符大小写。如果 base 为零,它会查找前导的 0b0o0x 来判断基数。如果这些不存在,则默认为 10。基数必须为 0 或介于 2 到 36(含)之间。如果 ptrNULL,它将包含指向扫描结束位置的指针。

如果转换后的值超出相应返回类型的范围,则发生范围错误(errno 被设置为 ERANGE),并返回 ULONG_MAX。如果无法执行任何转换,则返回 0

另请参阅 Unix 手册页 strtoul(3)

在 3.2 版本加入。

long PyOS_strtol(const char *str, char **ptr, int base)
作为 稳定 ABI 的一部分。

根据给定的 base,将 str 中的字符串的初始部分转换为 long 值,base 必须在 236(含)之间,或者是一个特殊值 0

PyOS_strtoul() 相同,但返回 long 值,并在溢出时返回 LONG_MAX

另请参阅 Unix 手册页 strtol(3)

在 3.2 版本加入。

double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
作为 稳定 ABI 的一部分。

将字符串 s 转换为 double,失败时引发 Python 异常。接受的字符串集对应于 Python 的 float() 构造函数接受的字符串集,但 s 不得有前导或尾随空格。转换与当前语言环境无关。

如果 endptrNULL,则转换整个字符串。如果字符串不是浮点数的有效表示,则引发 ValueError 并返回 -1.0

如果 endptr 不为 NULL,则尽可能多地转换字符串,并将 *endptr 设置为指向第一个未转换的字符。如果字符串的初始部分不是浮点数的有效表示,则将 *endptr 设置为指向字符串的开头,引发 ValueError,并返回 -1.0

如果 s 表示的值过大,无法存储在浮点数中(例如,在许多平台上 "1e500" 就是这样的字符串),那么如果 overflow_exceptionNULL,则返回 Py_INFINITY(带有适当的符号),并且不设置任何异常。否则,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)
作为 稳定 ABI 的一部分。

使用提供的 format_codeprecisionflagsdouble val 转换为字符串。

format_code 必须是 'e''E''f''F''g''G''r' 之一。对于 'r',提供的 precision 必须为 0 且会被忽略。'r' 格式代码指定标准的 repr() 格式。

flags 可以是 Py_DTSF_SIGNPy_DTSF_ADD_DOT_0Py_DTSF_ALT 中的零个或多个值的按位或组合。

  • Py_DTSF_SIGN 表示即使 val 为非负数,返回的字符串也总是以符号字符开头。

  • Py_DTSF_ADD_DOT_0 表示确保返回的字符串不会看起来像一个整数。

  • Py_DTSF_ALT 表示应用“备用”格式化规则。有关详细信息,请参阅 PyOS_snprintf()'#' 说明符的文档。

如果 ptypeNULL,则它指向的值将被设置为 Py_DTST_FINITEPy_DTST_INFINITEPy_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() 相同,只是它忽略了大小写。