diff --git a/docs/basic/abstract-method.md b/docs/basic/abstract-method.md index 64c2abdf..8e6615cb 100644 --- a/docs/basic/abstract-method.md +++ b/docs/basic/abstract-method.md @@ -4,7 +4,7 @@ title: A.42. Python OOP ➜ Abstract Method sidebar_label: A.42. OOP ➜ Abstract Method --- -Pada chapter ini kita akan mempelejari tentang apa itu abstract method beserta bagaimana penerapannya pada pemrograman OOP menggunakan Python. +Pada chapter ini kita akan mempelajari tentang apa itu abstract method beserta bagaimana penerapannya pada pemrograman OOP menggunakan Python. ## A.42.1. Pengenalan abstract method diff --git a/docs/basic/args-kwargs.md b/docs/basic/args-kwargs.md index feb2e732..3c574a34 100644 --- a/docs/basic/args-kwargs.md +++ b/docs/basic/args-kwargs.md @@ -140,7 +140,7 @@ print_data("sesuk prei", 2023, phone="nokia 3315", networks=["GSM", "TDMA"]) # message: sesuk prei # number: 2023 # -# param: phone, value: nokia 3310 +# param: phone, value: nokia 3315 # param: networks, value: ['GSM', 'TDMA'] ``` diff --git a/docs/basic/break-continue.md b/docs/basic/break-continue.md index a9d54d02..7acfdbbf 100644 --- a/docs/basic/break-continue.md +++ b/docs/basic/break-continue.md @@ -81,7 +81,7 @@ for i in range(max): Penjelasan: -- Program yang memiliki perulanga *nested* dengan jumlah perulangan ada 2. +- Program yang memiliki perulangan *nested* dengan jumlah perulangan ada 2. - Disiapkan sebuah variabel `bool` bernama `outer_loop` untuk kontrol perulangan terluar. - Ketika nilai `j` (yang merupakan variabel counter perulangan terdalam) adalah lebih dari atau sama dengan `7`, maka variabel `outer_loop` di set nilainya menjadi `False`, dan perulangan terdalam di-`break` secara paksa. - Dengan ini maka perulangan terluar akan terhenti. diff --git a/docs/basic/class-inheritance.md b/docs/basic/class-inheritance.md index 324464ab..a5971606 100644 --- a/docs/basic/class-inheritance.md +++ b/docs/basic/class-inheritance.md @@ -11,7 +11,7 @@ Chapter ini membahas tentang salah satu aspek penting dalam pemrograman OOP, yai Untuk mewujudkan inheritance setidaknya dua buah class dibutuhkan: - Super class / parent class, yaitu class yang property-nya ingin diwariskan atau diturunkan ke class dibawahnya. -- Sub class / derrived class, yaitu class yang mewarisi property dari parent class. +- Sub class / derived class, yaitu class yang mewarisi property dari parent class. Misalkan, ada sebuah class bernama `Vehicle` dan class ini memiliki property berikut: diff --git a/docs/basic/closure.md b/docs/basic/closure.md index 29241dfb..dd77eb1e 100644 --- a/docs/basic/closure.md +++ b/docs/basic/closure.md @@ -159,8 +159,8 @@ Di dalam fungsi `aggregate()`, closure `f` diharapkan untuk memiliki parameter y ### ◉ Source code praktik
-
- github.com/novalagung/dasarpemrogramanpython-example/../args-kwargs
+
+ github.com/novalagung/dasarpemrogramanpython-example/../closure
diff --git a/docs/basic/csv.md b/docs/basic/csv.md
index e7e98ed4..31a84a70 100644
--- a/docs/basic/csv.md
+++ b/docs/basic/csv.md
@@ -274,7 +274,7 @@ Jalankan ulang program, test fungsionalitas mode 1, 2, dan 3.
Kurang lebih seperti itu penerapan operasi CSV di Python. Silakan lanjut explore dan praktek dengan pembuatan program sejenis lainnya agar makin paham.
-## A.51.4. `csv.writer()` dan `csv.reader()`
+## A.51.5. `csv.writer()` dan `csv.reader()`
Selain menggunakan fungsi `csv.DictWriter()` dan `csv.DictReader()`, operasi baca tulis CSV bisa dilakukan menggunakan fungsi `csv.writer()` dan `csv.reader()`.
diff --git a/docs/basic/dataclass.md b/docs/basic/dataclass.md
index 2186bbf9..d4d2b0d3 100644
--- a/docs/basic/dataclass.md
+++ b/docs/basic/dataclass.md
@@ -10,23 +10,23 @@ Python menyediakan module bernama `dataclasses` dengan isi beberapa API untuk me
## A.43.1. Pengenalan Data Class
-Di bawah ini dicontohkan class bernama `Planet` disiapkan untuk pembuatan data berisi informasi planet. Class ini memiliki 3 buah instance attribute, yaitu `name`, `diameter`, dan `natural_sattelites`. Deklarasi attribute ditulis dalam fungsi `__init__()`.
+Di bawah ini dicontohkan class bernama `Planet` disiapkan untuk pembuatan data berisi informasi planet. Class ini memiliki 3 buah instance attribute, yaitu `name`, `diameter`, dan `natural_satellites`. Deklarasi attribute ditulis dalam fungsi `__init__()`.
```python
class Planet:
- def __init__(self, name, diameter, natural_sattelites):
+ def __init__(self, name, diameter, natural_satellites):
self.name = name
self.diameter = diameter
- self.natural_sattelites = natural_sattelites
+ self.natural_satellites = natural_satellites
planets = [
Planet("Mercury", 4879, []),
- Planet(name="Venus", diameter=12104, natural_sattelites=[]),
- Planet(diameter=12742, name="Earth", natural_sattelites=["Moon"]),
+ Planet(name="Venus", diameter=12104, natural_satellites=[]),
+ Planet(diameter=12742, name="Earth", natural_satellites=["Moon"]),
]
for p in planets:
- print(f"{p.name} | {p.diameter} km | {len(p.natural_sattelites)} moons")
+ print(f"{p.name} | {p.diameter} km | {len(p.natural_satellites)} moons")
# output ↓
#
@@ -48,7 +48,7 @@ from dataclasses import dataclass
class Planet:
name: str
diameter: float
- natural_sattelites: list[str]
+ natural_satellites: list[str]
planets = [
Planet("Mercury", 4879, []),
@@ -57,7 +57,7 @@ planets = [
]
for p in planets:
- print(f"{p.name} | {p.diameter} km | {len(p.natural_sattelites)} moons")
+ print(f"{p.name} | {p.diameter} km | {len(p.natural_satellites)} moons")
# output ↓
#
@@ -77,17 +77,17 @@ Cukup tambahkan decorator `@dataclass` saat deklarasi class, lalu tulis attribut
class Planet:
name: str
diameter: float
- natural_sattelites: list[str]
+ natural_satellites: list[str]
```
- Penulisan class biasa
```python
class Planet:
- def __init__(self, name, diameter, natural_sattelites):
+ def __init__(self, name, diameter, natural_satellites):
self.name = name
self.diameter = diameter
- self.natural_sattelites = natural_sattelites
+ self.natural_satellites = natural_satellites
```
## A.43.2. Attribute mutability
@@ -99,7 +99,7 @@ mars = Planet("Mars", 4, ["Phobos", "Deimos"])
mars.name = "Red Planet"
mars.diameter = 6779
-print(f"{mars.name} | {mars.diameter} km | {len(mars.natural_sattelites)} moons")
+print(f"{mars.name} | {mars.diameter} km | {len(mars.natural_satellites)} moons")
# output ➜ Red Planet | 6779 km | 2 moons
```
@@ -112,10 +112,10 @@ Data class bisa memiliki instance method dengan penulisan deklarasi sama persis
class Country:
name: str
seasons: list
- number_of_populations: float
+ number_of_population: float
def info(self) -> str:
- return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_populations} million population"
+ return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_population} million population"
countries = [
Country("Indonesia", ["Rainy", "Dry"], 275.5),
@@ -142,10 +142,10 @@ Attribute data class bisa ditentukan nilai defaultnya menggunakan operator assig
class Country:
name = "Indonesia"
seasons = ["Rainy", "Dry"]
- number_of_populations = 275.5
+ number_of_population = 275.5
def info(self) -> str:
- return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_populations} million population"
+ return f"{self.name} | {len(self.seasons)} seasons | {self.number_of_population} million population"
c = Country()
print(c.info())
diff --git a/docs/basic/datetime-parsing-formatting.md b/docs/basic/datetime-parsing-formatting.md
index 0e655ccd..ad906758 100644
--- a/docs/basic/datetime-parsing-formatting.md
+++ b/docs/basic/datetime-parsing-formatting.md
@@ -4,7 +4,7 @@ title: A.54. Python DateTime Parsing & Formatting
sidebar_label: A.54. DateTime ➜ Parsing & Formatting
---
-Chapter ini merupakan lanjutan dari chapter sebelumnmya. Di sini kita akan belajar tentang teknik parsing dan formatting pada tipe data `datetime`.
+Chapter ini merupakan lanjutan dari chapter sebelumnya. Di sini kita akan belajar tentang teknik parsing dan formatting pada tipe data `datetime`.
## A.54.1. Parsing `datetime`
@@ -47,7 +47,7 @@ Contoh implementasinya seperti ini:
# output ➜ datetime: 1985-04-12 23:20:50.520000+07:00
```
-Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting.md#a543-tabel-kode-format).
+Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format).
### ◉ Via `datetime.fromisoformat()` terhadap data ISO Date Time (ISO 8601)
@@ -127,7 +127,7 @@ print(data_datetime.strftime('%m/%d/%Y %H:%M:%S %z'))
# output ➜ 04/12/1985 23:20:50 +0700
```
-Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting.md#a543-tabel-kode-format).
+Selengkapnya silakan cek di bagian [A.54.3. Tabel kode format](/basic/datetime-parsing-formatting#a543-tabel-kode-format).
### ◉ Method `datetime.isoformat()` ➜ ISO Date Time (ISO 8601)
diff --git a/docs/basic/eval-exec.md b/docs/basic/eval-exec.md
index 8d863632..d027e5a8 100644
--- a/docs/basic/eval-exec.md
+++ b/docs/basic/eval-exec.md
@@ -23,6 +23,8 @@ Variabel `a`, `b`, dan `c` di ekspresi `'(a + b) / 20 + (c * c)'` nilainya teris
Ekspresi string berisi apapun bisa digunakan pada fungsi `eval()` ini, asalkan ekspresinya hanya 1 baris.
+> ⚠️ **Peringatan**: Fungsi `eval()` dan `exec()` sangat berbahaya jika digunakan dengan input dari sumber tidak terpercaya, karena dapat mengeksekusi kode berbahaya. Hindari menggunakannya pada data dari user. Sebagai alternatif yang lebih aman, gunakan `ast.literal_eval()` untuk mengevaluasi literal Python.
+
Jika ekspresi tidak valid, maka eksekusi fungsi `eval()` menghasilkan error, dan ketika itu terjadi ada baiknya di-handle dengan baik. Contoh:
```python
@@ -185,6 +187,52 @@ print(res)
# 314.0
```
+## A.57.4. Fungsi `ast.literal_eval()`
+
+Seperti yang sudah disebutkan pada peringatan di [A.57.1](#a571-fungsi-eval), fungsi `eval()` dan `exec()` berbahaya jika digunakan dengan input dari sumber tidak terpercaya karena dapat mengeksekusi kode berbahaya.
+
+Sebagai alternatif yang aman untuk mengevaluasi literal Python (seperti string, angka, list, tuple, dict, bool, `None`), Python menyediakan fungsi `ast.literal_eval()` dari module `ast` (bagian dari stdlib).
+
+Fungsi `ast.literal_eval()` hanya mengevaluasi literal — tidak bisa mengeksekusi ekspresi arbitrer. Ini membuatnya aman digunakan untuk parsing data dari user.
+
+Contoh penggunaan:
+
+```python
+import ast
+
+# aman: mengevaluasi literal dict
+data = ast.literal_eval("{'name': 'Noval', 'age': 30}")
+print(data)
+# output ➜ {'name': 'Noval', 'age': 30}
+print(type(data))
+# output ➜