gpt4 book ai didi

python - 使用 Python 中的 format() 方法打印 boolean 值 True/False

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:17 27 4
gpt4 key购买 nike

我试图为 boolean 表达式打印一个真值表。在执行此操作时,我偶然发现了以下内容:

>>> format(True, "") # shows True in a string representation, same as str(True)
'True'
>>> format(True, "^") # centers True in the middle of the output string
'1'

只要我指定了格式说明符,format() 就会将 True 转换为 1。我知道 boolint 的子类,因此 True 的计算结果为 1:

>>> format(True, "d") # shows True in a decimal format
'1'

但为什么在第一个示例中使用格式说明符会将 'True' 更改为 1

我转向了 docs for clarification .它唯一说的是:

A general convention is that an empty format string ("") produces the same result as if you had called str() on the value. A non-empty format string typically modifies the result.

因此,当您使用格式说明符时,字符串会被修改。但是,如果指定了对齐运算符(例如^),为什么要从True 更改为1

最佳答案

好问题!我相信我有答案。这需要深入了解 C 语言的 Python 源代码,所以请多多包涵。

首先,format(obj, format_spec) 只是obj.__format__(format_spec) 的语法糖。对于发生这种情况的具体位置,您必须查看 abstract.c , 在函数中:

PyObject *
PyObject_Format(PyObject* obj, PyObject *format_spec)
{
PyObject *empty = NULL;
PyObject *result = NULL;

...

if (PyInstance_Check(obj)) {
/* We're an instance of a classic class */
HERE -> PyObject *bound_method = PyObject_GetAttrString(obj, "__format__");
if (bound_method != NULL) {
result = PyObject_CallFunctionObjArgs(bound_method,
format_spec,
NULL);

...
}

要找到确切的调用,我们必须查看 intobject.c :

static PyObject *
int__format__(PyObject *self, PyObject *args)
{
PyObject *format_spec;

...

return _PyInt_FormatAdvanced(self,
^ PyBytes_AS_STRING(format_spec),
| PyBytes_GET_SIZE(format_spec));
LET'S FIND THIS
...
}

_PyInt_FormatAdvanced 实际上在formatter_string.c 中被定义为一个宏作为 formatter.h 中的函数:

static PyObject*
format_int_or_long(PyObject* obj,
STRINGLIB_CHAR *format_spec,
Py_ssize_t format_spec_len,
IntOrLongToString tostring)
{
PyObject *result = NULL;
PyObject *tmp = NULL;
InternalFormatSpec format;

/* check for the special case of zero length format spec, make
it equivalent to str(obj) */
if (format_spec_len == 0) {
result = STRINGLIB_TOSTR(obj); <- EXPLICIT CAST ALERT!
goto done;
}

... // Otherwise, format the object as if it were an integer
}

这就是您的答案。简单检查format_spec_len是否为0,如果是,则将obj转换为字符串。如您所知,str(True)'True',谜底揭晓了!

关于python - 使用 Python 中的 format() 方法打印 boolean 值 True/False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31091800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com