字符串转换和格式化 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/conversion
跳转至:导航、​搜索

字符串转换和格式化

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

int PyOS_snprintf(char *str, size_t size, const char *format, ...)
根据格式字符串 format 和额外的参数,输出不超过 size 个字节到 str。 请参阅 Unix 手册页 snprintf(3)
int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
根据格式字符串format和变量参数列表va输出不超过size个字节到str。 Unix 手册页 vsnprintf(3)

PyOS_snprintf()PyOS_vsnprintf() 包装了标准 C 库函数 snprintf()vsnprintf()。 它们的目的是在极端情况下保证一致的行为,而标准 C 函数则没有。

包装器确保 str[size-1] 在返回时始终为 '\0'。 他们从不向 str 写入超过 size 个字节(包括尾随的 '\0')。 这两个函数都需要 str != NULLsize > 0format != NULL

如果平台没有 vsnprintf() 并且避免截断所需的缓冲区大小超过 size 超过 512 个字节,则 Python 会以 Py_FatalError() 中止。

这些函数的返回值 (rv) 应解释如下:

  • 0 <= rv < size时,输出转换成功,rv字符被写入str(不包括str[rv]处的尾随'\0'字节)。
  • rv >= size 时,输出转换被截断,并且需要具有 rv + 1 字节的缓冲区才能成功。 在这种情况下,str[size-1]'\0'
  • rv < 0 时,“发生了不好的事情。” str[size-1] 在这种情况下也是 '\0',但 str 的其余部分未定义。 错误的确切原因取决于底层平台。

以下函数提供与语言环境无关的字符串到数字的转换。

double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)

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

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

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

如果 s 表示的值太大而无法存储在浮点数中(例如,"1e500" 在许多平台上都是这样的字符串),那么如果 overflow_exception 是 [ X155X] 返回 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)

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

format_code 必须是 'e''E''f''F''g'、[ X95X] 或 '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() '#' 说明符的文档。

如果 ptype 是非 NULL,那么它指向的值将被设置为 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() 几乎相同,只是它忽略了大小写。