Pemformatan (Formatting) Di Python
Python memiliki metode pemformatan (formatting) yang powerful. Ada dua cara atau style formatting di Python, ialah dengan style lama dan dengan style baru. Style lama menggunakan tanda persen %
, sedangkan style gres menggunakan metode format()
. Di artikel ini, Anda akan menjumpai formatting string dan bilangan lengkap yang mencakup penggunaan format cara lama dan gres disertai dengan pola – contohnya.
Tabel konten
- Formatting Dasar
- Konversi Nilai
- Padding dan Perataan String
- Pemotongan String Panjang
- Bilangan
- Padding Bilangan
- Bilangan Bertanda
- Placeholder Bernama
- Getitem dan Getattr
- Datetime
- Format Berparameter
- Objek Kustomasi
Formatting Dasar
Formatting posisi kemungkinan yakni hal yang paling sering kita jumpai. Kita menggunakannya pada dikala urutan dari argumen tidak ingin diubah, dan hanya ada sedikit elemen yang akan digabungkan. Metode formatting ini cocoknya yakni untuk memformat elemen yang jumlahnya sedikit.
Old | '%s %s' % ('one', 'two') |
New | '{} {}'.format('one', 'two') |
Output | one two |
Old | '%d %d' % (1, 2) |
New | '{} {}'.format(1, 2) |
Output | 1 2 |
Dengan style performatan yang baru, kita mampu menggunakan indeks untuk mempertukarkan posisi dua buah penampung (placeholder). Contohnya yakni mirip berikut.
Operasi berikut tidak tersedia pada style formatting lama
New | '{1} {0}'.format('one', 'two') |
Output | two one |
Konversi Nilai
Style pemformatan yang gres secara default memanggil metode __format__()
dari objek untuk ditampilkan. Jika kita hanya ingin menampilkan output dari str()
atau repr()
, kita mampu menggunakan flag konversi !s
atau !r
.
Pada style formatting lama, kita menggunakan %s
untuk mewakili string, dan %r
digunakan untuk metode repr()
Setup
class Data(object):
def __str__(self):
return 'str'
def __repr__(self):
return 'repr'
Old | '%s %r' % (Data(), Data()) |
New | '{0!s} {0!r}'.format(Data()) |
Output | str repr |
Di Python 3, ada flag konversi komplemen yang menggunakan output dari repr()
tapi menggunakan ascii()
Setup
class Data(object):
def __repr__(self):
return 'repr'
Old | '%r %a' % (Data(), Data()) |
New | '{0!r} {0!a}'.format(Data()) |
Output | repr r\xe4pr |
Padding dan Perataan String
Normalnya, nilai yang diformat mengambil lebar sebanyak abjad yang akan direpresentasikannya. Akan tetapi, kita mampu mengatur sendiri berapa lebar yang kita inginkan.
Cara meratakan string berbeda antara style lama dan yang baru. Style yang lama defaultnya yakni rata kanan, sedangkan style gres defaultnya yakni rata kiri.
Rata kanan:
Old | '%10s' % ('test',) |
New | '{:>10}'.format('test') |
Output | test |
Rata kiri:
Old | '%-10s' % ('test',) |
New | '{:10}'.format('test') |
Output | test |
Style formatting yang gres memiliki beberapa fitur untuk mengatur bagaimana padding dan perataan dilakukan, ialah sebagai berikut:
- Kita mampu menyesuaikan abjad padding
Operasi berikut tidak tersedia pada style formatting lama
New | '{:_<10}'.format('test') |
Output | test______ |
- Kita mampu mengatur rata tengah
Operasi berikut tidak tersedia pada style formatting lama
New | '{:^10}'.format('test') |
Output | test |
- Selain itu, penggunaan rata tengah dimana panjang stringnya tidak tepat dibagi dua, maka abjad ekstra akan ditambahkan di sebelah kanan.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:^6}'.format('zip') |
Output | zip |
Pemotongan String Panjang
Berbeda dengan padding yang menambahkan lebar pada string, kita juga mampu melakukan pemotongan (truncating) untuk memotong jumlah abjad yang ada pada string.
Angka yang di belakang tanda .
di dalam spesifikasi format digunakan untuk mengatur presisi dari output. Artinya string tersebut akan dipotong menjadi sepanjang angka tersebut.
Old | '%.5s' % ('pythonindo',) |
New | '{:.5}'.format('pythonindo') |
Output | pytho |
Menggabungkan Pemotongan dan Padding
Kita juga mampu menggabungkan antara pemotongan dengan padding
Old | '%-10.5s' % ('pythonindo',) |
New | '{:10.5}'.format('pythonindo') |
Output | pytho |
Bilangan
Kita juga mampu memformat bilangan mirip halnya string.
Integer:
Old | '%d' % (42,) |
New | '{:d}'.format(42) |
Output | 42 |
Float:
Old | '%f' % (3.141592653589793,) |
New | '{:f}'.format(3.141592653589793) |
Output | 3.141593 |
Padding Bilangan
Sama halnya dengan string, bilangan juga mampu dibuat dengan panjang tertentu.
Old | '%4d' % (42,) |
New | '{:4d}'.format(42) |
Output | 42 |
Selain itu, bilangan juga mampu dipotong dengan jumlah desimal tertentu. Kita juga mampu menggabungkan antara pemotongan dengan padding. Untuk bilangan float, nilai padding memperlihatkan panjang dari total panjang output.
Pada pola berikut, kita menginginkan output terdiri dari 6 abjad dengan 2 angka di belakang koma.
Old | '%06.2f' % (3.141592653589793,) |
New | '{:06.2f}'.format(3.141592653589793) |
Output | 003.14 |
Pada integer, menambahkan presisi tidak akan memiliki kegunaan dan tidak dianjurkan pada style formatting yang gres (dapat menjadikan ValueError
)
Old | '%04d' % (42,) |
New | '{:04d}'.format(42) |
Output | 0042 |
Bilangan Bertanda
Normalnya, bilangan negatif diawali dengan tanda. Tentu saja ini mampu diubahsuaikan sesuai dengan kebutuhan kita.
Old | '%+d' % (42,) |
New | '{:+d}'.format(42) |
Output | +42 |
Penggunaan tanda spasi dalam format, dan tanda minus diikuti spasi di depan bilangan, digunakan untuk memperlihatkan bahwa bilangan tersebut yakni negatif.Sedangkan penggunaan tanda spasi tanpa diikuti tanda apapun, memperlihatkan bahwa bilangan tersebut yakni positif. Contohnya yakni mirip berikut.
Old | '% d' % ((- 23),) |
New | '{: d}'.format((- 23)) |
Output | -23 |
Old | '% d' % (42,) |
New | '{: d}'.format(42) |
Output | 42 |
Style formatting yang gres juga mampu mengatur posisi dari tanda relatif terhadap padding.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:=5d}'.format((- 23)) |
Output | - 23 |
New | '{:=+5d}'.format(23) |
Output | + 23 |
Placeholder Bernama
Baik style formatting yang lama maupun yang baru, keduanya mendukung penampung (placeholder) bernama.
Setup
data = {'firts': 'Hello', 'last': 'Hello!'}
Old | '%(first)s %(last)s' % data |
New | '{first} {last}'.format(**data) |
Output | Hello Hello! |
Metode format()
juga mendapat argumen kata kunci.
Operasi berikut tidak tersedia pada style formatting lama
New | '{first} {last}'.format(first='Hello', last='Hello!') |
Output | Hello Hello! |
Getitem dan Getattr
Style formatting yang gres memperlihatkan fleksibilitas untuk mengakses struktur data bercabang. Style ini mendukung pengaksesan dictionary maupun list.
Operasi berikut tidak tersedia pada style formatting lama
Setup
person = {'firts': 'Budi', 'last': 'Santoso'}
New | '{p[first]} {p[last]}'.format(p=person) |
Output | Budi Santoso |
Setup
data = [4, 8, 15, 17, 20, 45]
New | '{d[4]} {d[5]}'.format(d=data) |
Output | 20 45 |
Kita juga mampu mengakses objek via getattr()
Operasi berikut tidak tersedia pada style formatting lama
Setup
class Plant(object):
type = 'tree'
New | '{p.type}'.format(p=Plant()) |
Output | tree |
Operasi berikut tidak tersedia pada style formatting lama
Setup
class Plant(object):
type = 'tree'
kinds = [{'name': 'mahoni'}, {'name': 'apel'}]
New | '{p.type}: {p.kinds[0][name]}'.format(p=Plant()) |
Output | tree: mahoni |
Datetime
Style formatting yang gres juga mampu digunakan untuk memformat objek mirip datetime
. Datetime ini yakni objek Python yang berhubungan dengan waktu dan tanggal.
Operasi berikut tidak tersedia pada style formatting lama
Setup
from datetime import datetime
New | '{:%Y-%m-%d %H:%M}'.format(datetime(2017, 8, 3, 4, 5)) |
Output | 2017-08-03 04:05 |
Format Berparameter
Kita juga mampu memasukkan spesifikasi format yang kita inginkan di dalam metode format()
. Format berparameter di letakkan di dalam tanda kurung kurawal setelah tanda titik dua.
Style lama juga mendukung parameterisasi, tapi terbatas hanya untuk mengatur lebar dan presisi dari output.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{align}{width}}'.format('test', align='^', width='10') |
Output | test |
- Menggunakan parameter presisi
Old | '%.*s = %.*f' % (3, 'Eksponen', 3, 2.7182) |
New | '{:.{prec}} = {:.{prec}f}'.format('Eksponen', 2.7182, prec=3) |
Output | Eks = 2.718 |
- Menggunakan parameter lebar dan presisi
Old | '%*.*f' % (5, '2', 2.7182) |
New | '{:.{width}.{prec}f}'.format(2.7182, width=5, prec=3) |
Output | = 2.72 |
Format bersarang mampu digunakan untuk menggantikan sembarang belahan dari spesifikasi format. Oleh sebab itu, pola di atas mampu ditulis ulang dengan cara berikut:
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{prec}} = {:{prec}}'.format('Eksponen', 2.7182, prec='.3') |
Output | Eks = 2.72 |
Komponen – komponen datetime juga mampu ditulis terpisah.
Operasi berikut tidak tersedia pada style formatting lama
Setup
from datetime import datetime
dt = datetime(2017, 8, 3, 4, 5)
New | '{:{dfmt} {tfmt}}'.format(dt, dfmt='%Y-%m-%d', tfmt='%H:%M') |
Output | 2017-08-03 04:05 |
Format bersarang mampu digunakan sebagai argumen posisi. Posisi tergantung pada urutan dari tanda kurung kurawal.
Operasi berikut tidak tersedia pada style formatting lama
New | '{:{}{}{}.{}}'.format(2.7182818284, '>', '+', 10, 3) |
Output | +2.72 |
Argumen kata kunci juga mampu dicampur ke dalam format
New | '{:{}{sign}{}.{}}'.format(2.7182818284, '>', 10, 3, sign='+') |
Output | +2.72 |
Objek Kustomasi
Contoh di atas yang menggunakan metode magic __format__()
pada objek di Python. Kita mampu mendefinisikan sendiri format untuk menangani objek yang kita buat untuk menangani metode __format__()
ini. Dengan begitu, kita mampu mengatur sintaks yang digunakan.
Setup
class HAL9000(object):
def __format__(self, format):
if (format == 'open-the-pod-bay-doors'):
return "I'm afraid I can't do that."
return 'HAL9000'
New | '{:open-the-pod-bay-doors}'.format(HAL9000()) |
Output | I'm afraid I can't do that. |
Source: pyformat.info