優秀的問題!我相信我有答案。這需要通過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'
,神祕感已經結束!
來源
2014-05-14 23:36:06
huu
「一般慣例是空格式字符串(」「)產生的結果與您對該值調用str()時的結果相同,非空格式字符串通常會修改結果。 - [docs](https://docs.python.org/2/library/string.html#format-specification-mini-language) – netcoder
我不知道爲什麼這樣做,但如果你想修復它可以做'format(str(True),「^」)' – jspurim
謝謝,我已經修復了它,但我只是好奇「爲什麼」:) –