Drucken von booleschen Werten True / False mit der Methode format () in Python

Ich habe versucht, eine Wahrheitstabelle für boolesche Ausdrücke zu drucken. Während ich das tat, stolperte ich über folgendes:

>>> 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' 

Sobald ich einen Format-Spezifizierer spezifiziere, wandelt format() True auf 1 . Ich weiß, dass bool ist eine Unterklasse von int , so dass True bewertet 1 :

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

Aber warum ändert sich mit dem Format-Spezifizierer im ersten Beispiel 'True' auf 1 ?

Ich wandte mich an die Dokumente zur Klärung . Das einzige, was es heißt, ist:

Eine allgemeine Konvention ist, dass ein leerer Formatstring ( "" ) das gleiche Ergebnis erzeugt, als ob man str() auf den Wert genannt hätte. Ein nicht leerer Formatstring ändert normalerweise das Ergebnis.

So wird die Zeichenfolge geändert, wenn Sie einen Formatspezifizierer verwenden. Aber warum ist der Wechsel von True auf 1 wenn nur ein Ausrichtungsoperator (zB ^ ) angegeben ist?

    One Solution collect form web for “Drucken von booleschen Werten True / False mit der Methode format () in Python”

    Ausgezeichnete Frage! Ich glaube, ich habe die Antwort. Dies erfordert das Graben durch den Python-Quellcode in C, also bär mit mir.

    Zuerst ist das format(obj, format_spec) nur syntaktischer Zucker für obj.__format__(format_spec) . Für genau dort, wo dies geschieht, musst du in abstract.c suchen, in der Funktion:

     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); ... } 

    Um den genauen Anruf zu finden, müssen wir in intobject.c suchen:

     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 ist eigentlich als Makro in formatter_string.c als Funktion in formatter.h definiert definiert:

     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 } 

    Und darin liegt deine Antwort. Eine einfache Überprüfung, ob format_spec_len 0 , und wenn es ist, konvertieren obj in einen String. Wie du weißt, ist str(True) 'True' , und das Mysterium ist vorbei!

    Python ist die beste Programmiersprache der Welt.