pprint — Pretty-Print di Python 3

Bagus Aji Santoso 27 Maret 2018

pprint — Pretty-Print di Python 3

Modul pprint dipakai untuk mencetak struktur data agar lebih mudah untuk dibaca. Ia bisa memformat struktur data yang bisa di baca dengan benar oleh interpreter, namun juga mudah bagi manusia untuk membacanya. Pesan keluarannya akan dicetak dalam satu baris jika memungkinkan, atau di indentasi ke beberapa baris jika tidak.

Semua contoh di bawah akan menggunakan konten dari file pprint_data.py berikut ini (letakkan satu folder dengan file lain):

# pprint_data.py data = [ (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']), ]

Menggunakan pprint

Cara termudah untuk menggunakan modul ini ialah dengan memanggil fungsi pprint().

# pprint_pprint.py from pprint import pprint from pprint_data import data print('PRINT:') print(data) print() print('PPRINT:') pprint(data)

Fungsi pprint() akan memformat sebuah objek data yang dikirimkan sebagai argumen dan menuliskannya kembali ke sys.stdout (layar/terminal).

$ python3 pprint_pprint.py PRINT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), ( 3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])] PPRINT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

Mengatur Format pprint

Jika ingin memformat suatu data tanpa menampilkannya secara langsung (misalnya untuk logging), gunakan pformat() untuk membuatkan representasi string-nya.

# pprint_pformat.py import logging from pprint import pformat from pprint_data import data logging.basicConfig( level=logging.DEBUG, format='%(levelname)-8s %(message)s', ) logging.debug('Logging pformatted data') formatted = pformat(data) for line in formatted.splitlines(): logging.debug(line.rstrip())

String yang diformat lalu bisa dicetak atau di log.

$ python3 pprint_pformat.py DEBUG Logging pformatted data DEBUG [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), DEBUG (2, DEBUG {'e': 'E', DEBUG 'f': 'F', DEBUG 'g': 'G', DEBUG 'h': 'H', DEBUG 'i': 'I', DEBUG 'j': 'J', DEBUG 'k': 'K', DEBUG 'l': 'L'}), DEBUG (3, ['m', 'n']), DEBUG (4, ['o', 'p', 'q']), DEBUG (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

Custom Class

Kelas PrettyPrinter yang dipakai oleh pprint() bisa juga bekerja dengan custom class, jika memiliki method __repr__().

pprint_arbitrary_object.py from pprint import pprint class node: def __init__(self, name, contents=[]): self.name = name self.contents = contents[:] def __repr__(self): return ( 'node(' + repr(self.name) + ', ' + repr(self.contents) + ')' ) trees = [ node('node-1'), node('node-2', [node('node-2-1')]), node('node-3', [node('node-3-1')]), ] pprint(trees)

Berikut ini representasi string dari tiga objek bersarang yang dicetak dengan pprint:

$ python3 pprint_arbitrary_object.py [node('node-1', []), node('node-2', [node('node-2-1', [])]), node('node-3', [node('node-3-1', [])])]

Recursion

Struktur data rekursif bisa ditampilkan dengan mereferensikan sumber data asli dengan format <Recursion on typename with id=number>.

#pprint_recursion.py from pprint import pprint local_data = ['a', 'b', 1, 2] local_data.append(local_data) print('id(local_data) =>', id(local_data)) pprint(local_data)

Pada contoh ini, list local_data ditambahkan kepada dirinya sendiri sehingga membuat sebuah proses rekursif.

$ python3 pprint_recursion.py id(local_data) => 4358913288 ['a', 'b', 1, 2, <Recursion on list with id=4358913288>]

Membatasi Nested Output

Untuk struktur data yang dalam, mungkin kita tidak perlu untuk menampilkan seluruh datanya. Jika kita tampilkan seluruhnya, data tersebut bisa tidak terformat dengan baik, teks yang terformat terlalu besar, atau beberapa data bisa terlihat tidak berhubungan.

#pprint_depth.py from pprint import pprint from pprint_data import data pprint(data, depth=1) pprint(data, depth=2)

Gunakan argumen depth untuk mengontrol seberapa jauh kita ingin mencetak struktur data tersebut. TIngkat kedalaman yang tidak termasuk kebagian yang ditampilkan akan dicetak dengan ....

$ python3 pprint_depth.py [(...), (...), (...), (...), (...)] [(1, {...}), (2, {...}), (3, [...]), (4, [...]), (5, [...])]

Mengontrol Lebar Output

Lebar string yang dicetak oleh pprint adalah 80 karakter. Untuk mengatur lebarnya, bisa mengirimkan argumen width ke pprint().

# pprint_width.py from pprint import pprint from pprint_data import data for width in [80, 5]: print('WIDTH =', width) pprint(data, width=width) print()

Saat lebar terlalu kecil, pprint akan menambah lebarnya seminimal mungkin agar sintaks yang dicetak tetap valid.

$ python3 pprint_width.py

WIDTH = 80
[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),
 (2,
  {'e': 'E',
   'f': 'F',
   'g': 'G',
   'h': 'H',
   'i': 'I',
   'j': 'J',
   'k': 'K',
   'l': 'L'}),
 (3, ['m', 'n']),
 (4, ['o', 'p', 'q']),
 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

WIDTH = 5
[(1,
  {'a': 'A',
   'b': 'B',
   'c': 'C',
   'd': 'D'}),
 (2,
  {'e': 'E',
   'f': 'F',
   'g': 'G',
   'h': 'H',
   'i': 'I',
   'j': 'J',
   'k': 'K',
   'l': 'L'}),
 (3,
  ['m',
   'n']),
 (4,
  ['o',
   'p',
   'q']),
 (5,
  ['r',
   's',
   'tu',
   'v',
   'x',
   'y',
   'z'])]

Argumen compact memeberitahu pprint() untuk mencoba memaksimalkan data yang dicetak di satu baris dari pada menecetak data baru di baris yang baru.

# pprint_compact.py from pprint import pprint from pprint_data import data print('DEFAULT:') pprint(data, compact=False) print('\nCOMPACT:') pprint(data, compact=True)

Contoh di bawah memperlihatkan, apabila data tidak muat dicetak di satu baris maka mereka akan dicetak di baris berbeda (lihat data kedua). Jika lebih dari satu data muat untuk ditampilkan di baris yang sama, maka cetak kedua data tersebut bersama.

$ python3 pprint_compact.py

DEFAULT:
[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),
 (2,
  {'e': 'E',
   'f': 'F',
   'g': 'G',
   'h': 'H',
   'i': 'I',
   'j': 'J',
   'k': 'K',
   'l': 'L'}),
 (3, ['m', 'n']),
 (4, ['o', 'p', 'q']),
 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

COMPACT:
[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),
 (2,
  {'e': 'E',
   'f': 'F',
   'g': 'G',
   'h': 'H',
   'i': 'I',
   'j': 'J',
   'k': 'K',
   'l': 'L'}),
 (3, ['m', 'n']), (4, ['o', 'p', 'q']),
 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

Diterjemahkan dari Python 3 Module of the Week karya Dough Hellman.