Pemformatan (Formatting) di Python

Python memiliki metode pemformatan (formatting) yang powerful. Ada dua cara atau style formatting di Python, yaitu dengan style lama dan dengan style baru. Style lama menggunakan tanda persen %, sedangkan style baru menggunakan metode format(). Di artikel ini, Anda akan menjumpai formatting string dan bilangan lengkap yang mencakup penggunaan format cara lama dan baru disertai dengan contoh – contohnya.

Tabel konten


Formatting Dasar

Formatting posisi kemungkinan adalah hal yang paling sering kita jumpai. Kita menggunakannya pada saat urutan dari argumen tidak ingin diubah, dan hanya ada sedikit elemen yang akan digabungkan. Metode formatting ini cocoknya adalah 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 bisa menggunakan indeks untuk mempertukarkan posisi dua buah penampung (placeholder). Contohnya adalah seperti berikut.

Operasi berikut tidak tersedia pada style formatting lama

New '{1} {0}'.format('one', 'two')
Output two one

Konversi Nilai

Style pemformatan yang baru secara default memanggil metode __format__() dari objek untuk ditampilkan. Jika kita hanya ingin menampilkan output dari str() atau repr(), kita bisa 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 tambahan 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 karakter yang akan direpresentasikannya. Akan tetapi, kita bisa mengatur sendiri berapa lebar yang kita inginkan.

Cara meratakan string berbeda antara style lama dan yang baru. Style yang lama defaultnya adalah rata kanan, sedangkan style baru defaultnya adalah 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 baru memiliki beberapa fitur untuk mengatur bagaimana padding dan perataan dilakukan, yaitu sebagai berikut:

  • Kita bisa menyesuaikan karakter padding

Operasi berikut tidak tersedia pada style formatting lama

New '{:_<10}'.format('test')
Output test______
  • Kita bisa 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 karakter 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 bisa melakukan pemotongan (truncating) untuk memotong jumlah karakter 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 bisa menggabungkan antara pemotongan dengan padding

Old '%-10.5s' % ('pythonindo',)
New '{:10.5}'.format('pythonindo')
Output pytho

Bilangan

Kita juga bisa memformat bilangan seperti 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 bisa dibuat dengan panjang tertentu.

Old '%4d' % (42,)
New '{:4d}'.format(42)
Output 42

Selain itu, bilangan juga bisa dipotong dengan jumlah desimal tertentu. Kita juga bisa menggabungkan antara pemotongan dengan padding. Untuk bilangan float, nilai padding menunjukkan panjang dari total panjang output.

Pada contoh berikut, kita menginginkan output terdiri dari 6 karakter 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 berguna dan tidak dianjurkan pada style formatting yang baru (dapat menyebabkan ValueError)

Old '%04d' % (42,)
New '{:04d}'.format(42)
Output 0042

Bilangan Bertanda

Normalnya, bilangan negatif diawali dengan tanda. Tentu saja ini bisa disesuaikan 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 menunjukkan bahwa bilangan tersebut adalah negatif.Sedangkan penggunaan tanda spasi tanpa diikuti tanda apapun, menunjukkan bahwa bilangan tersebut adalah positif. Contohnya adalah seperti berikut.

Old '% d' % ((- 23),)
New '{: d}'.format((- 23))
Output -23
Old '% d' % (42,)
New '{: d}'.format(42)
Output 42

 

Style formatting yang baru juga bisa 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 menerima 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 baru memberikan 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 bisa 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 baru juga bisa digunakan untuk memformat objek seperti datetime. Datetime ini adalah 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 bisa 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 bisa digunakan untuk menggantikan sembarang bagian dari spesifikasi format. Oleh karena itu, contoh di atas bisa 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 bisa 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 bisa 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 bisa 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 bisa mendefinisikan sendiri format untuk menangani objek yang kita buat untuk menangani metode __format__() ini. Dengan begitu, kita bisa 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