CLI yang nyata jarang berhenti pada satu argumen nama. Program meminta angka, menawarkan pilihan terbatas, menyediakan flag on/off, sampai menerima daftar nilai sekaligus. Chapter ini membahas fitur argparse yang mengubah teks mentah dari terminal menjadi nilai Python yang sudah tervalidasi: parameter type, choices, action, nargs, grup saling eksklusif, hingga selera merancang bantuan --help yang enak dibaca.
Validasi Tipe dengan type dan choices #
Secara default setiap argumen datang sebagai string. Parameter type=int meminta parser mengubah teks menjadi bilangan bulat, choices membatasi nilai yang diterima, metavar merapikan placeholder di bantuan, dan action="count" menghitung berapa kali sebuah opsi diketik. Berkas hitung.py menggabungkan semuanya:
import argparse
parser = argparse.ArgumentParser(description="Mencetak pesan beberapa kali.")
parser.add_argument("pesan", help="pesan yang akan dicetak")
parser.add_argument("--ulang", type=int, default=1, choices=range(1, 4), metavar="N",
help="jumlah pengulangan, 1-3 (default: 1)")
parser.add_argument("-v", "--verbose", action="count", default=0,
help="tingkatkan detail keluaran, boleh berulang")
args = parser.parse_args()
for _ in range(args.ulang):
print(args.pesan)
if args.verbose >= 1:
print(f"[dicetak {args.ulang} kali, verbose={args.verbose}]")Mari kita bedah baris-baris pentingnya:
- Baris 5 (
type=int, default=1, choices=range(1, 4)): parser memanggilint()pada teks yang diberikan, memastikan nilainya berada di antara 1 sampai 3, dan memakai1saat opsi tidak diisi. - Baris 5 (
metavar="N"): mengubah placeholder di bantuan dari--ulang ULANGmenjadi--ulang Nagar lebih ringkas. - Baris 7 (
action="count", default=0): setiap kemunculan-vmenambah nilaiargs.verbose, sehingga-vbernilai1dan-v -vbernilai2. - Baris 14-15 (
if args.verbose >= 1:): mencontohkan penggunaan level verbose untuk menampilkan informasi tambahan.
Jalankan dua variasi berikut:
python3 hitung.py "Halo Dunia" --ulang 2
python3 hitung.py "Halo" --ulang 2 -vOutput yang Dihasilkan:
Halo Dunia
Halo Dunia
Halo
Halo
[dicetak 2 kali, verbose=1]Validasi bekerja bahkan sebelum program berjalan. Nilai --ulang 5 ditolak parser dengan pesan ke stderr dan exit code 2:
usage: hitung.py [-h] [--ulang N] [-v] pesan
hitung.py: error: argument --ulang: invalid choice: '5' (choose from 1, 2, 3)Nilai action yang paling sering dipakai dirangkum berikut:
Nilai action | Perilaku | Tipe hasil | Contoh |
|---|---|---|---|
"store" (default) | menyimpan satu nilai | mengikuti type | --ulang 2 menjadi 2 |
"store_true" | flag tanpa nilai | bool | --apply menjadi True |
"store_false" | kebalikan store_true | bool | --no-warna menjadi False |
"count" | menghitung kemunculan | int | -v -v menjadi 2 |
Satu Opsi, Banyak Nilai dengan nargs #
Parameter nargs mengizinkan satu opsi menerima beberapa nilai. Berkas laporan.py memakai nargs="+" untuk satu atau lebih email, required=True untuk opsi yang tetap wajib, serta nargs="?" dengan const untuk opsi opsional yang boleh muncul tanpa nilai:
import argparse
parser = argparse.ArgumentParser(
description="Menyiapkan laporan untuk dikirim.",
epilog="Contoh: laporan.py --penerima [email protected] --detail",
)
parser.add_argument("--penerima", nargs="+", required=True, metavar="EMAIL",
help="satu atau lebih alamat email penerima")
parser.add_argument("--format", choices=["teks", "json"], default="teks",
help="format laporan (default: teks)")
parser.add_argument("--judul", nargs="?", const="Laporan Harian", default=None, metavar="TEKS",
help="judul laporan; tanpa nilai memakai Laporan Harian")
mode = parser.add_mutually_exclusive_group()
mode.add_argument("--ringkas", action="store_true", help="keluaran ringkas")
mode.add_argument("--detail", action="store_true", help="keluaran detail")
args = parser.parse_args()
print("penerima :", ", ".join(args.penerima))
print("format :", args.format)
print("judul :", args.judul if args.judul else "(tanpa judul)")
print("mode :", "ringkas" if args.ringkas else "detail" if args.detail else "normal")Tiga perilaku nargs patut dicermati:
- Baris 7 (
nargs="+"):args.penerimamenjadi list berisi semua nilai setelah--penerima, minimal satu. - Baris 11 (
nargs="?", const="Laporan Harian", default=None): jika--judultidak ditulis, nilainyaNone; jika ditulis tanpa nilai, nilainya"Laporan Harian"; jika ditulis dengan nilai, nilai itulah yang dipakai. - Baris 7 (
required=True): opsi tetap opsional secara gaya penulisan, tetapi program menolak berjalan tanpa opsi tersebut.
Jalankan dua variasi berikut:
python3 laporan.py --penerima [email protected] [email protected] --judul
python3 laporan.py --penerima [email protected] --detailOutput yang Dihasilkan:
penerima : [email protected], [email protected]
format : teks
judul : Laporan Harian
mode : normal
penerima : [email protected]
format : teks
judul : (tanpa judul)
mode : detailRingkasan nilai nargs:
Nilai nargs | Arti | Saat tidak diisi |
|---|---|---|
"+" | satu atau lebih nilai | galat karena wajib |
"*" | nol atau lebih nilai | list kosong [] |
"?" | nol atau satu nilai | default; const bila flag muncul tanpa nilai |
N (angka) | tepat N nilai | galat karena wajib |
Opsi yang Saling Eksklusif #
Baris 14-16 pada laporan.py membentuk mutually exclusive group melalui add_mutually_exclusive_group(). Parser memastikan hanya salah satu dari --ringkas atau --detail yang boleh dipakai dalam satu perintah. Menggabungkan keduanya memicu penolakan:
usage: laporan.py [-h] --penerima EMAIL [EMAIL ...] [--format {teks,json}]
[--judul [TEKS]] [--ringkas | --detail]
laporan.py: error: argument --detail: not allowed with argument --ringkasPesan galat seperti ini jauh lebih murah daripada membiarkan dua opsi bertentangan lolos ke logika program.
Merancang Tampilan –help #
Bantuan adalah halaman depan CLI. Parameter description menjelaskan program, epilog menambahkan catatan penutup, dan metavar menjaga placeholder tetap pendek. Tampilan python3 laporan.py --help:
usage: laporan.py [-h] --penerima EMAIL [EMAIL ...] [--format {teks,json}]
[--judul [TEKS]] [--ringkas | --detail]
Menyiapkan laporan untuk dikirim.
options:
-h, --help show this help message and exit
--penerima EMAIL [EMAIL ...]
satu atau lebih alamat email penerima
--format {teks,json} format laporan (default: teks)
--judul [TEKS] judul laporan; tanpa nilai memakai Laporan Harian
--ringkas keluaran ringkas
--detail keluaran detail
Contoh: laporan.py --penerima [email protected] --detailBeberapa kebiasaan yang membuat bantuan enak dibaca: tulis help satu kalimat pendek dan mulai dengan huruf kecil, sebutkan nilai default secara eksplisit, dan pilih metavar yang bermakna seperti EMAIL atau FILE. Bila epilog berisi baris-baris contoh yang tidak boleh dibungkus, tambahkan formatter_class=argparse.RawDescriptionHelpFormatter pada ArgumentParser.
Dengan kombinasi type, choices, action, nargs, dan grup eksklusif, kontrak antara pengguna dan program menjadi tegas sejak baris perintah. Selanjutnya, kita melihat kanal konfigurasi lain yang tidak berpindah lewat terminal: environment variables.