Python Attrs:Kelas Data Tingkat Lanjut, Dengan Kode Contoh
Paket Python Attrs memungkinkan Anda membuat kelas data lanjutan menggunakan anotasi sederhana. Tentu saja, python juga memiliki modul kelas data asli sendiri, tetapi paket Python attrs menawarkan beberapa fitur tambahan yang mungkin Anda sukai!
Daftar isi
Instal attrs
Paket attrs bukan bagian dari pustaka dasar, 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. Paket tersebut bernama attrs, jadi menginstalnya akan terlihat seperti ini:
$ pip install attrs
# or with pipenv:
$ pipenv install attrs
Attrs vs kelas data
Penulis attrs pada kenyataannya, telah bekerja pada PEP yang memperkenalkan kelas data ke dalam Python. Kelas data asli Python sengaja dibuat lebih sederhana dan lebih mudah dipahami sementara attrs menawarkan berbagai fitur yang mungkin Anda inginkan!
Beberapa alasan untuk memilih Python attrs atas kelas data bawaan adalah:
Anda menggunakan versi Python dari sebelum 3.7. Attrs telah Anda bahas karena mendukung semua versi Python utama, termasuk CPython 2.7 dan PyPy.
Anda menginginkan lebih banyak fitur:attrs menawarkan validator dan konverter
Anda menginginkan performa optimal dan penggunaan memori minimal menggunakan kelas berslot attrs
Contoh dasar Python attrs
Mari kita lihat contoh yang sangat mendasar 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 bertele-tele daripada kelas data, tetapi Anda mendapatkan fitur tambahan sebagai imbalannya.
Serupa dengan kelas data, Anda mendapatkan representasi data yang diformat dengan baik saat Anda mencetaknya.
Paket attrs menggunakan nama yang dipilih dengan cerdas seperti attr.ib , jadi Anda hanya perlu mengimpor attr. Sebagai alternatif, Anda dapat mengimpor nama lengkap. Misalnya dengan from attr import attrib, attrs , dan gunakan nama tersebut sebagai gantinya. Fungsinya sama.
Selanjutnya mari kita lihat fitur terpenting yang ditawarkan paket ini dibandingkan kelas data biasa:validator dan konverter.
Contoh validator attrs Python
Anda dapat menambahkan validator ke kelas data attrs Anda dengan dua cara:
Menggunakan dekorator
Dengan menyediakan fungsi yang dapat dipanggil
Saya akan mendemonstrasikan metode fungsi yang dapat dipanggil di sini terlebih dahulu. Attrs menawarkan beberapa validator di luar kotak, di mana kami akan menggunakan instance_of validator 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 kami mencoba membuat objek C dengan nilai string untuk x, validator instance_of akan memunculkan kesalahan karena memerlukan tipe int alih-alih string.
Sekarang mari kita 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 will be something like:
# DividableByTwo(x=60)
# ...
# ValueError: 11 is not dividable by 2
Contoh konverter attrs Python
Konverter mengambil nilai yang ditetapkan dan mengonversinya secara otomatis. Anda dapat menggunakan ini untuk semua jenis tujuan. Salah satu contohnya adalah secara otomatis mengonversi nilai menjadi int. Sekali lagi, mari kita mulai dengan menggunakan fungsi yang dapat dipanggil, dalam hal ini kita cukup menggunakan fungsi int() 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 menggunakan dua contoh di atas untuk terlebih dahulu mengonversi input apa pun menjadi int, lalu memeriksa apakah nilainya dapat dibagi dua.
Menggunakan slot dengan Python attrs
Terakhir, Anda dapat memberi tahu attrs untuk menggunakan kelas slotted. Kelas slotted memiliki beberapa keunggulan dibandingkan kelas reguler:
Mereka memiliki jejak memori yang kecil
Mereka lebih cepat
Singkatnya, dengan kelas slotted Anda secara eksplisit menyatakan atribut instance mana yang Anda harapkan dimiliki oleh instance objek Anda. Dengan cara ini, Python dapat mengabaikan beberapa pemeriksaan dan semacamnya, menghasilkan lebih sedikit penggunaan memori dan sedikit peningkatan kecepatan. Anda dapat menemukan detail lebih lanjut di dokumentasi attrs di sini.
Namun, kelas slotted juga memiliki peringatan, terutama saat Anda membuatnya secara manual. Untungnya, attrs menawarkan cara sederhana untuk mengaktifkan fitur ini:
import attr
@attr.s(slots=True)
class YourClassName:
...