10. Tur Singkat Pustaka Standar
*******************************


10.1. Antarmuka Sistem Operasi
==============================

Modul "os" menyediakan puluhan fungsi untuk berinteraksi dengan sistem
operasi:

   >>> import os
   >>> os.getcwd()      # Return the current working directory
   'C:\\Python39'
   >>> os.chdir('/server/accesslogs')   # Change current working directory
   >>> os.system('mkdir today')   # Run the command mkdir in the system shell
   0

Pastikan untuk menggunakan gaya "import os" alih-alih "from os import
*". Ini akan menjaga "os.open()" dari membayangi *shadowing* fungsi
bawaan "open()" yang beroperasi jauh berbeda.

Fungsi bawaan "dir()" dan "help()" berguna sebagai alat bantu
interaktif untuk bekerja dengan modul besar seperti "os":

   >>> import os
   >>> dir(os)
   <returns a list of all module functions>
   >>> help(os)
   <returns an extensive manual page created from the module's docstrings>

Untuk tugas manajemen berkas dan direktori sehari-hari, modul "shutil"
menyediakan antarmuka level yang lebih tinggi yang lebih mudah
digunakan:

   >>> import shutil
   >>> shutil.copyfile('data.db', 'archive.db')
   'archive.db'
   >>> shutil.move('/build/executables', 'installdir')
   'installdir'


10.2. Berkas *Wildcard*
=======================

Modul "glob" menyediakan fungsi untuk membuat daftar berkas dari
pencarian *wildcard* di direktori:

   >>> import glob
   >>> glob.glob('*.py')
   ['primes.py', 'random.py', 'quote.py']


10.3. Baris Perintah Berargumen
===============================

Skrip utilitas umum seringkali perlu memproses argumen baris perintah.
Argumen-argumen ini disimpan dalam atribut *argv* dari modul "sys"
sebagai daftar. Sebagai contoh, hasil keluaran berikut dari
menjalankan "python demo.py one two three" di baris perintah

   >>> import sys
   >>> print(sys.argv)
   ['demo.py', 'one', 'two', 'three']

Modul "argparse" menyediakan mekanisme yang lebih canggih untuk
memproses argumen baris perintah. Script berikut mengekstrak satu atau
lebih nama file dan sejumlah baris opsional untuk ditampilkan:

   import argparse

   parser = argparse.ArgumentParser(
       prog='top',
       description='Show top lines from each file')
   parser.add_argument('filenames', nargs='+')
   parser.add_argument('-l', '--lines', type=int, default=10)
   args = parser.parse_args()
   print(args)

Ketika dijalankan pada baris perintah dengan "python top.py --lines=5
alpha.txt beta.txt", skrip mengatur "args.lines" menjadi "5" dan
"args.filenames" menjadi "['alpha.txt', 'beta.txt']".


10.4. Pengalihan Output Kesalahan dan Pengakhiran Program
=========================================================

Modul "sys" juga memiliki atribut untuk *stdin*, *stdout*, dan
*stderr*. Yang terakhir berguna untuk mengirimkan peringatan dan pesan
kesalahan untuk membuatnya terlihat bahkan ketika *stdout* telah
dialihkan:

   >>> sys.stderr.write('Warning, log file not found starting a new one\n')
   Warning, log file not found starting a new one

Cara paling langsung untuk mengakhiri skrip adalah dengan menggunakan
"sys.exit()".


10.5. Pencocokan Pola String
============================

Modul "re" menyediakan alat ekspresi reguler untuk pemrosesan string
lanjutan. Untuk pencocokan dan manipulasi yang kompleks, ekspresi
reguler menawarkan solusi yang ringkas dan dioptimalkan:

   >>> import re
   >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
   ['foot', 'fell', 'fastest']
   >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
   'cat in the hat'

Ketika hanya kemampuan sederhana yang diperlukan, metode string lebih
disukai karena lebih mudah dibaca dan dilakukan *debug*:

   >>> 'tea for too'.replace('too', 'two')
   'tea for two'


10.6. Matematika
================

Modul "math" memberikan akses ke fungsi-fungsi pustaka C yang
mendasari untuk matematika angka pecahan *floating point*:

   >>> import math
   >>> math.cos(math.pi / 4)
   0.70710678118654757
   >>> math.log(1024, 2)
   10.0

Modul "random" menyediakan alat untuk membuat pilihan acak:

   >>> import random
   >>> random.choice(['apple', 'pear', 'banana'])
   'apple'
   >>> random.sample(range(100), 10)   # sampling without replacement
   [30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
   >>> random.random()    # random float
   0.17970987693706186
   >>> random.randrange(6)    # random integer chosen from range(6)
   4

Modul "statistics" menghitung sifat statistik dasar (rata-rata,
median, varian, dll.) dari data numerik:

   >>> import statistics
   >>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]
   >>> statistics.mean(data)
   1.6071428571428572
   >>> statistics.median(data)
   1.25
   >>> statistics.variance(data)
   1.3720238095238095

Proyek SciPy <https://scipy.org> memiliki banyak modul lain untuk
perhitungan numerik.


10.7. Akses internet
====================

Ada sejumlah modul untuk mengakses internet dan memproses protokol
internet. Dua yang paling sederhana adalah "urllib.request" untuk
mengambil data dari URL dan "smtplib" untuk mengirim email:

   >>> from urllib.request import urlopen
   >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response:
   ...     for line in response:
   ...         line = line.decode()             # Convert bytes to a str
   ...         if line.startswith('datetime'):
   ...             print(line.rstrip())         # Remove trailing newline
   ...
   datetime: 2022-01-01T01:36:47.689215+00:00

   >>> import smtplib
   >>> server = smtplib.SMTP('localhost')
   >>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
   ... """To: jcaesar@example.org
   ... From: soothsayer@example.org
   ...
   ... Beware the Ides of March.
   ... """)
   >>> server.quit()

(Perhatikan bahwa contoh kedua membutuhkan server mail yang beroperasi
di localhost.)


10.8. Tanggal dan Waktu
=======================

Modul "datetime" menyediakan kelas untuk memanipulasi tanggal dan
waktu dengan cara yang sederhana dan kompleks. Sementara aritmatika
tanggal dan waktu didukung, fokus implementasi adalah pada ekstraksi
anggota yang efisien untuk pemformatan dan manipulasi keluaran. Modul
ini juga mendukung objek yang sadar zona waktu.

   >>> # dates are easily constructed and formatted
   >>> from datetime import date
   >>> now = date.today()
   >>> now
   datetime.date(2003, 12, 2)
   >>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
   '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

   >>> # dates support calendar arithmetic
   >>> birthday = date(1964, 7, 31)
   >>> age = now - birthday
   >>> age.days
   14368


10.9. Kompresi Data
===================

Format pengarsipan dan kompresi data umum didukung langsung oleh
modul-modul yang ada antara lain: :mod: *zlib*, "gzip", "bz2", "lzma",
"zipfile" dan "tarfile".

   >>> import zlib
   >>> s = b'witch which has which witches wrist watch'
   >>> len(s)
   41
   >>> t = zlib.compress(s)
   >>> len(t)
   37
   >>> zlib.decompress(t)
   b'witch which has which witches wrist watch'
   >>> zlib.crc32(s)
   226805979


10.10. Pengukuran Kinerja
=========================

Beberapa pengguna Python mengembangkan minat yang mendalam untuk
mengetahui kinerja relatif dari berbagai pendekatan untuk masalah yang
sama. Python menyediakan alat pengukuran yang segera menjawab
pertanyaan-pertanyaan itu.

Misalnya, mungkin tergoda untuk menggunakan fitur *tuple* *packing*
dan *unpacking* daripada pendekatan tradisional untuk bertukar
argumen. Modul :mod: *timeit* dengan cepat menunjukkan keunggulan
kinerja secara sederhana:

   >>> from timeit import Timer
   >>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
   0.57535828626024577
   >>> Timer('a,b = b,a', 'a=1; b=2').timeit()
   0.54962537085770791

Berbeda dengan granularity tingkat halus "timeit", modul "profile" dan
"pstats" menyediakan alat untuk mengidentifikasi bagian kritis waktu
dalam blok kode yang lebih besar.


10.11. Kontrol kualitas
=======================

Salah satu pendekatan untuk mengembangkan perangkat lunak berkualitas
tinggi adalah dengan menulis tes untuk setiap fungsi yang dikembangkan
dan untuk sering menjalankan tes tersebut selama proses pengembangan.

Modul: mod:*doctest* menyediakan alat untuk memindai modul dan
memvalidasi tes yang tertanam dalam dokumen program. Konstruksi
pengujian sesederhana memotong dan menempel panggilan khas beserta
hasilnya ke dalam docstring. Ini meningkatkan dokumentasi dengan
memberikan contoh kepada pengguna dan memungkinkan modul *doctest*
untuk memastikan kode tetap benar untuk dokumentasi:

   def average(values):
       """Computes the arithmetic mean of a list of numbers.

       >>> print(average([20, 30, 70]))
       40.0
       """
       return sum(values) / len(values)

   import doctest
   doctest.testmod()   # automatically validate the embedded tests

Modul "unittest" tidak semudah modul "doctest", tetapi memungkinkan
serangkaian tes yang lebih komprehensif untuk dipertahankan dalam file
terpisah:

   import unittest

   class TestStatisticalFunctions(unittest.TestCase):

       def test_average(self):
           self.assertEqual(average([20, 30, 70]), 40.0)
           self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
           with self.assertRaises(ZeroDivisionError):
               average([])
           with self.assertRaises(TypeError):
               average(20, 30, 70)

   unittest.main()  # Calling from the command line invokes all tests


10.12. Dilengkapi Baterai
=========================

Python memiliki filosofi "dilengkapi baterai". Ini paling baik dilihat
melalui kemampuan yang canggih dan kuat *robust* dengan dukungan
paket-paket yang lebih besar. Sebagai contoh:

* The "xmlrpc.client" and "xmlrpc.server" modules make implementing
  remote procedure calls into an almost trivial task.  Despite the
  modules' names, no direct knowledge or handling of XML is needed.

* Paket "email" adalah pustaka untuk mengelola pesan email, termasuk
  MIME dan lainnya **RFC 2822** dokumen pesan berbasis. Tidak seperti
  "smtplib" dan "poplib" yang benar-benar mengirim dan menerima pesan,
  paket email memiliki toolset lengkap untuk membangun atau
  mendekodekan struktur pesan kompleks (termasuk lampiran) dan untuk
  mengimplementasikan pengkodean internet dan protokol header.

* Paket "json" menyediakan dukungan kuat untuk mengurai format
  pertukaran data populer ini. Modul "csv" mendukung pembacaan dan
  penulisan berkas secara langsung dalam format Nilai Terpisah-Koma
  atau CSV, umumnya didukung oleh database dan spreadsheet. Pemrosesan
  XML didukung oleh paket "xml.etree.ElementTree", "xml.dom" dan
  "xml.sax". Bersama-sama, modul dan paket ini sangat menyederhanakan
  pertukaran data antara aplikasi Python dan alat lainnya.

* Modul "sqlite3" adalah pembungkus untuk pustaka basis data SQLite,
  menyediakan basis data persisten yang dapat diperbarui dan diakses
  menggunakan sintaks SQL yang sedikit tidak standar.

* Internasionalisasi didukung oleh sejumlah modul termasuk paket
  "gettext", "locale", dan "codecs".
