Menguasai Python Attrs: Bangun Class Data Lanjutan dengan Contoh Praktis
Paket Python Attrs memungkinkan Anda membuat class data lanjutan menggunakan anotasi sederhana. Tentu saja, Python memiliki modul class data bawaannya juga, tetapi paket Python attrs menawarkan beberapa fitur tambahan yang mungkin Anda sukai!
Daftar isi
Instal attrs
Paket attrs bukan bagian dari perpustakaan bawaan, jadi Anda perlu menginstalnya dengan perintah pip install atau yang serupa, seperti Pipenv. Anda mungkin juga ingin membuat lingkungan virtual, sehingga tidak akan mengganggu proyek lain yang Anda miliki. Paketnya disebut attrs, jadi menginstalnya akan terlihat seperti ini:
$ pip install attrs # atau dengan pipenv: $ pipenv install attrs
Attrs vs data classes
Penulis attrs sebenarnya telah bekerja pada PEP yang memperkenalkan data classes ke dalam Python. Data classes bawaan Python sengaja dibuat lebih sederhana dan lebih mudah dipahami sementara attrs menawarkan seluruh rentang fitur yang mungkin Anda inginkan!
Beberapa alasan untuk memilih Python attrs dibandingkan data classes bawaan adalah:
Anda menggunakan versi Python sebelum 3.7. Attrs mendukung semua versi Python mainstream, termasuk CPython 2.7 dan PyPy.
Anda ingin lebih banyak fitur: attrs menawarkan validator dan konverter
Anda ingin kinerja optimal dan penggunaan memori minimal menggunakan class slotted attrs
Contoh dasar Python attrs
Mari kita lihat contoh yang sangat dasar terlebih dahulu:
import attr @attr.s class Person(object): name = attr.ib(default='John') surname = attr.ib(default='Doe') age = attr.ib(init=False) p = Person() print(p) p = Person('Bill', 'Gates') p.age = 60 print(p) # Output: # Person(name='John', surname='Doe', age=NOTHING) # Person(name='Bill', surname='Gates', age=60)
Beberapa pengamatan:
Sintaksnya kurang elegan dan lebih rinci daripada data classes, tetapi Anda mendapatkan fitur tambahan sebagai imbalannya.
Mirip dengan data classes, Anda mendapatkan representasi yang diformat dengan baik dari data Anda saat Anda mencetaknya.
Paket attrs menggunakan nama yang dipilih dengan cerdas seperti attr.ib, jadi Anda hanya perlu mengimpor attr. Anda dapat, alternatifnya, mengimpor nama lengkapnya. Misalnya dengan from attr import attrib, attrs, dan gunakan nama tersebut sebagai gantinya. Fungsionalitasnya sama.
Selanjutnya mari kita lihat fitur terpenting yang ditawarkan paket ini dibandingkan data classes reguler: validator dan konverter.
Contoh validator Python attrs
Anda dapat menambahkan validator ke class data attrs Anda dengan dua cara:
Menggunakan decorator
Dengan menyediakan fungsi callable
Saya akan mendemonstrasikan metode fungsi callable di sini terlebih dahulu. Attrs menawarkan beberapa validator secara bawaan, di mana kita akan menggunakan validator instance_of dalam contoh berikut:
>>> @attr.s ... class C(object): ... x = attr.ib(validator=attr.validators.instance_of(int)) >>> C(42) C(x=42) >>> C("a string") Traceback (most recent call last): ... TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
Karena kita mencoba membuat objek C dengan nilai string untuk x, validator instance_of melemparkan kesalahan karena memerlukan tipe int alih-alih string.
Mari kita sekarang definisikan validator kita sendiri:
import attr @attr.s class DividableByTwo(object): x = attr.ib() @x.validator def check(self, attribute, value): if value % 2 != 0: raise ValueError(f'{value} is not dividable by 2') print (DividableByTwo(60)) print (DividableByTwo(11)) # Output akan seperti: # DividableByTwo(x=60) # ... # ValueError: 11 is not dividable by 2
Contoh konverter Python attrs
Konverter mengambil nilai yang diatur dan mengonversinya secara otomatis. Anda dapat menggunakannya untuk semua tujuan. Satu contoh adalah untuk secara otomatis mengonversi nilai menjadi int. Lagi, mari kita mulai dengan menggunakan fungsi callable, dalam kasus ini kita cukup menggunakan fungsi int() bawaan Python:
import attr @attr.s class C(object): x = attr.ib(converter=int) c = C("1") print(c) # Output: # C(x=1)
Input kami (string “1”) dikonversi menjadi integer secara otomatis. Karena konverter dijalankan sebelum validator, Anda dapat memvalidasi nilai akhir setelah konversi. Misalnya, Anda dapat menggabungkan dua contoh di atas untuk pertama mengonversi semua input menjadi int, dan kemudian memeriksa apakah nilai tersebut dapat dibagi dengan dua.
Menggunakan slots dengan Python attrs
Terakhir, Anda dapat memberi tahu attrs untuk menggunakan class slotted. Class slotted memiliki beberapa keuntungan dibandingkan class reguler:
Mempunyai footprint memori yang kecil
Lebih cepat
Singkatnya, dengan class slotted Anda secara eksplisit menyatakan atribut instance apa yang Anda harapkan dari objek instance Anda. Dengan cara ini, Python dapat mengabaikan beberapa pemeriksaan dan hal semacam itu, menghasilkan penggunaan memori yang lebih sedikit dan peningkatan kecepatan sedikit. Anda dapat menemukan lebih banyak detail dalam dokumentasi attrs di sini.
Namun, class slotted juga memiliki keterbatasan, terutama ketika Anda membuatnya secara manual. Untungnya, attrs menawarkan cara sederhana untuk mengaktifkan fitur ini:
import attr @attr.s(slots=True) class YourClassName: ...
Terus belajar
Artikel kami tentang data classes Python
Tutorial kami tentang class dan objek Python
Untuk lebih banyak contoh, kunjungi halaman contoh attrs