Bab 8: Validasi Input¶
80% bug program berasal dari user input yang tidak terduga. Validasi yang baik = setengah dari kualitas program.
Sampai sekarang, validasi input kita lakukan manual:
while True:
try:
umur = int(input("Umur: "))
if 0 < umur <= 120:
break
print("Umur harus 1-120")
except ValueError:
print("Bukan angka")
Berfungsi, tapi 7 baris untuk validasi sederhana. Kalau program kamu butuh banyak input, ini cepat jadi spaghetti.
pyinputplus = library yang merangkum semua validasi input umum jadi satu baris.
Setelah Bab 8, kamu akan bisa:
- Pakai
pyinputplusuntuk validasi otomatis - Set min/max, default, timeout, retry limit
- Validasi custom dengan fungsi sendiri
8.1. Install¶
8.2. Fungsi Utama¶
flowchart TD
Start([User input]) --> Cek{Validasi<br/>otomatis}
Cek -- Valid --> Done([Return value<br/>ke variable])
Cek -- Invalid --> RetryCheck{Retry<br/>tersisa?}
RetryCheck -- Ya --> Show[Tampilkan error,<br/>minta input lagi]
Show --> Cek
RetryCheck -- Tidak --> Exception([Raise<br/>RetryLimitException])
style Start fill:#10b981,stroke:#10b981,color:#fafafa
style Done fill:#10b981,stroke:#10b981,color:#fafafa
style Cek fill:#1a1a1a,stroke:#f59e0b,color:#fafafa
style RetryCheck fill:#1a1a1a,stroke:#f59e0b,color:#fafafa
style Show fill:#1a1a1a,stroke:#6366f1,color:#fafafa
style Exception fill:#1a1a1a,stroke:#ef4444,color:#fafafa
Cara baca flowchart
Flowchart ini menunjukkan siklus validasi otomatis PyInputPlus — yang biasanya kamu tulis manual dengan try/except + while, sudah jadi bawaan.
Alur:
- Input dari user
- Validasi otomatis — sesuai jenis fungsi (
inputIntcek angka,inputEmailcek format email, dll) - Kalau valid → return value, lanjut ke kode berikutnya
- Kalau invalid → cek apakah masih ada retry tersisa (parameter
limit) - Kalau masih bisa retry → tampilkan error, minta input lagi (loop)
- Kalau retry habis → raise
RetryLimitException
Yang membedakan dari try/except manual:
| Manual | PyInputPlus |
|---|---|
| 7-10 baris kode per input | 1 baris |
| Harus tulis loop sendiri | Otomatis |
| Pesan error generic | Pesan spesifik (e.g. "must be ≥ 18") |
| Susah set retry limit | Tinggal limit=3 |
| Tidak ada timeout | Tinggal timeout=10 |
Untuk validasi standar (angka dengan range, email, date) — pakai PyInputPlus jelas menang. Untuk validasi unik (cek di database, regex aneh) — masih bisa pakai dengan inputCustom + fungsi sendiri.
inputStr — Input string dengan validasi¶
blank=False artinya tidak boleh kosong — pengguna harus ketik sesuatu.
inputNum, inputInt, inputFloat — Angka¶
umur = pyip.inputInt(prompt="Umur: ", min=1, max=120)
harga = pyip.inputFloat(prompt="Harga: ", greaterThan=0)
Otomatis loop sampai user kasih angka valid dalam range.
inputChoice — Pilihan dari daftar¶
User harus ketik salah satu dari pilihan, atau program loop minta lagi.
inputMenu — Menu bernomor¶
Output:
User bisa ketik "1" atau "Tambah" — keduanya valid.
inputYesNo, inputBool¶
lanjut = pyip.inputYesNo(prompt="Lanjut? ") # 'yes' / 'no'
setuju = pyip.inputBool(prompt="Setuju? ") # 'true' / 'false'
inputEmail, inputDate, inputTime¶
8.3. Parameter Lanjutan¶
default — Nilai default kalau kosong¶
Kalau user tekan Enter tanpa ketik apapun, nama jadi "Anonim".
limit — Maksimum percobaan¶
try:
umur = pyip.inputInt(min=1, max=120, limit=3)
except pyip.RetryLimitException:
print("Sudah 3x salah, exit.")
timeout — Batas waktu¶
allowRegexes, blockRegexes — Filter custom¶
# Hanya boleh huruf
nama = pyip.inputStr(allowRegexes=[r"^[a-zA-Z]+$"])
# Tolak yang mengandung angka
nama = pyip.inputStr(blockRegexes=[r"\d"])
Custom Validator¶
def validasi_genap(value):
angka = int(value)
if angka % 2 != 0:
raise Exception("Harus genap!")
angka = pyip.inputCustom(validasi_genap, prompt="Angka genap: ")
8.4. Project: Form Pendaftaran¶
import pyinputplus as pyip
print("=" * 40)
print("FORM PENDAFTARAN".center(40))
print("=" * 40)
nama = pyip.inputStr(prompt="Nama lengkap: ", blank=False)
email = pyip.inputEmail(prompt="Email: ")
umur = pyip.inputInt(prompt="Umur: ", min=17, max=99)
jenis_kelamin = pyip.inputMenu(
["Laki-laki", "Perempuan"],
prompt="Jenis kelamin:\n",
numbered=True,
)
paket = pyip.inputMenu(
["Reguler (Rp 100rb)", "Premium (Rp 250rb)", "VIP (Rp 500rb)"],
prompt="Pilih paket:\n",
numbered=True,
)
setuju = pyip.inputYesNo(prompt="Setuju syarat & ketentuan? ")
if setuju == "no":
print("Pendaftaran dibatalkan.")
else:
print()
print("=" * 40)
print("DATA PENDAFTAR".center(40))
print("=" * 40)
print(f"Nama : {nama}")
print(f"Email : {email}")
print(f"Umur : {umur}")
print(f"Gender : {jenis_kelamin}")
print(f"Paket : {paket}")
5 baris validasi input — bandingkan dengan ~30 baris kalau pakai try/except manual.
8.5. Kapan Pakai vs Manual¶
Pakai pyinputplus |
Pakai manual |
|---|---|
| Banyak input (form, wizard) | Cuma 1-2 input |
| Validasi standar (angka, email) | Validasi unik |
| Prototype cepat | Library minimal |
8.6. Ringkasan¶
pyinputplusmenyederhanakan validasi input- Fungsi utama:
inputStr,inputInt,inputFloat,inputChoice,inputMenu,inputYesNo,inputEmail,inputDate - Parameter penting:
min,max,default,limit,timeout,blank - Custom:
allowRegexes,blockRegexes,inputCustom
8.7. Latihan¶
8.1 — Survey App¶
Buat program survey 5 pertanyaan — campur tipe (string, int, choice, yes/no).
8.2 — Quiz Time¶
Quiz pilihan ganda 10 soal pakai inputMenu. Hitung skor di akhir.
8.3 — Booking¶
Booking tiket: nama (string), tanggal (date), jam (time), kelas (choice), jumlah (int min=1).
Install¶
Import¶
Fungsi Utama¶
pyip.inputStr(prompt="...")
pyip.inputInt(min=1, max=100)
pyip.inputFloat(greaterThan=0)
pyip.inputChoice(["a", "b", "c"])
pyip.inputMenu(["A", "B"], numbered=True)
pyip.inputYesNo() # 'yes'/'no'
pyip.inputBool() # 'true'/'false'
pyip.inputEmail()
pyip.inputDate() # date object
pyip.inputTime() # time object
Parameter Penting¶
| Param | Fungsi |
|---|---|
prompt |
Teks pertanyaan |
default |
Nilai kalau kosong |
blank=True |
Boleh kosong |
min, max |
Range angka |
limit=3 |
Max retry |
timeout=10 |
Detik |
allowRegexes |
Whitelist pattern |
blockRegexes |
Blacklist pattern |
Custom Validator¶
def validasi(value):
if int(value) % 2 != 0:
raise Exception("Harus genap")
pyip.inputCustom(validasi)