Bagaimana booleans diformat dalam Strings in Python?

170

Saya melihat saya tidak bisa melakukan:

"%b %b" % (True, False)

dalam Python. Saya kira %bb (oolean). Apakah ada yang seperti ini?

Juanjo Conti
sumber
1
Apa yang Anda inginkan hasilnya? Benar dan salah? Anda ingin '% s'. % b, ketika ada, adalah untuk biner (seperti pada basis-2).
Thomas Wouters
1
Ho ya! "% s" tampaknya berfungsi dengan baik. Balas pertanyaan ini dan dapatkan jawaban yang dipilih. Saya biasa melakukan "% s"% str (Salah). Malu pada saya :)
Juanjo Conti
3
tautan ke dokumentasi yang relevan: docs.python.org/library/…
mechanical_meat

Jawaban:

247
>>> print "%r, %r" % (True, False)
True, False

Ini tidak spesifik untuk nilai boolean - %rmemanggil __repr__metode pada argumen. %s(untuk str) juga harus bekerja.

danben
sumber
2
Apa perbedaan utama antara %rdan %s?
Alston
22
Saya selalu memikirkan hal ini, tetapi perbaiki jika saya salah. % s (dan karenanya str ()) bertujuan untuk merepresentasikan objek setransparan mungkin bagi manusia. % r (dan dengan demikian repr ()) bertujuan untuk merepresentasikan objek setransparan mungkin untuk python. Misalnya, print(str("foo"))hanya mencetak foopada baris baru. print(repr("foo"))namun mencetak 'foo'pada baris baru, termasuk tanda kutip, karena itulah yang Anda butuhkan untuk mengetikkan interpreter python untuk mendapatkan objek yang sesuai dengan argumen dalam python.
bobismijnnaam
66

Jika Anda ingin True Falsemenggunakan:

"%s %s" % (True, False)

karena str(True)ini 'True'dan str(False)itu 'False'.

atau jika Anda ingin 1 0menggunakan:

"%i %i" % (True, False)

karena int(True)ini 1dan int(False)itu 0.

Desintegr
sumber
18

Anda juga dapat menggunakan kelas string Formatter

print "{0} {1}".format(True, False);
print "{0:} {1:}".format(True, False);
print "{0:d} {1:d}".format(True, False);
print "{0:f} {1:f}".format(True, False);
print "{0:e} {1:e}".format(True, False);

Inilah hasilnya

True False
True False
1 0
1.000000 0.000000
1.000000e+00 0.000000e+00

Beberapa %specifier tipe -format ( %r, %i) tidak tersedia. Untuk detailnya lihat Format Spesifikasi Mini-Bahasa

Serigala
sumber
4
Perhatikan bahwa menambahkan opsi pemformatan dapat mengacaukan ini. Misalnya {:_^5}akan membuat Anda '__1__'kecuali Anda str(...)para boolean.
Michael - Di mana Clay Shirky
2
Anda dapat mengatasi masalah dengan konversi jenis seperti !s: '{!s:_^5}'.format(True)adalah'True_'
Michael - Di mana Clay Shirky
4

Untuk memperbarui ini untuk Python-3 Anda dapat melakukan ini

"{} {}".format(True, False)

Namun jika Anda ingin benar-benar memformat string (mis. Tambahkan spasi putih), Anda menjumpai Python yang melemparkan boolean ke dalam nilai C yang mendasarinya (yaitu int), mis.

>>> "{:<8} {}".format(True, False)
'1        False'

Untuk menyiasatinya, Anda dapat menggunakan Truestring, mis

>>> "{:<8} {}".format(str(True), False)
'True     False'
irritable_phd_syndrom
sumber