pprint — Pretty-Print di Python 3

Ditulis oleh Lobot Hijau, dipublikasi pada 27 Mar 2018 dalam kategori Tutorial
pprint — Pretty-Print di Python 3 - CodePolitan.com

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.



Berlangganan Informasi CodePolitan Melalui Email

Jangan sampai kamu melewatkan informasi penting tentang pemrograman dan teknologi! Kamu bisa berlangganan Newsletter CodePolitan dengan cara mengisi formulir di samping.

Ingin belajar coding lebih terstruktur? Gabung kelas online CodePolitan sekarang!