One-liner Yang Memvalidasi Jenis Input ke Fungsi Anda Saat Waktu Proses – Menuju AI

One-liner Yang Memvalidasi Jenis Input ke Fungsi Anda Saat Waktu Proses – Menuju AI

Author(s): Shangjie Lyu

Awalnya diterbitkan di Menuju AI.

dengan penjelasan kode sumber dan implementasi yang disederhanakan

Fotografi oleh Penulis

Catatan: artikel ini adalah bagian dari seri saya “Teknik dan Alat Sederhana untuk Ilmu Data”, yang merupakan kumpulan alat canggih pelengkap. Artikel ini didasarkan pada: mypy 0.991 pydantic 1.10.2 beartype 0.11.0.

One-liner yang akan dibahas di sini adalah dekorator validate_arguments yang disediakan oleh pydantic. Saya juga akan menjelaskan kode sumber dan mengimplementasikan versi yang disederhanakan di bagian akhir!

1. Ketik petunjuk

Jika Anda sudah terbiasa dengan petunjuk jenis, silakan lewati bagian ini; tetapi jika tidak, saya akan menjelaskannya dengan contoh sederhana.

Sebagian besar bahasa statis seperti Java memerlukan argumen dan tipe pengembalian yang akan ditentukan untuk fungsi.

Di sini, di fungsi Java addTwoNums, kita tahu bahwa dua argumen num1 num2 dan return semuanya bertipe int. Dalam persamaan Python, kita dapat mendeklarasikan tipe dalam docstring atau dokumentasi.

Namun, ada cara yang lebih asli untuk mendefinisikannya — ketikkan petunjuk.

Seperti yang ditunjukkan oleh kode di atas, kita dapat mendefinisikan tipe argumen dan pengembalian menggunakan petunjuk tipe (: untuk argumen dan -> untuk pengembalian), jadi kita tidak perlu menuliskannya lagi di docstring.

Type hinting adalah fitur yang relatif baru dan diperkenalkan di Python 3.5. Ada perdebatan seputar apakah akan menggunakan petunjuk tipe atau tidak karena, bagaimanapun, Python adalah bahasa yang diketik secara dinamis, dan tipenya sama sekali tidak ditegakkan. Secara pribadi, saya pikir itu adalah praktik yang baik untuk menambahkan petunjuk jenis, karena tidak hanya meningkatkan keterbacaan kode dan membuat dokumentasi lebih mudah tetapi juga memungkinkan untuk berbagai pemeriksaan terkait jenis, seperti yang akan saya perkenalkan di bawah ini, dan saya menggunakan petunjuk jenis dalam pekerjaan saya.

2. Validasi jenis masukan terhadap petunjuk jenis

Ada beberapa alat yang memungkinkan kita memeriksa kode berdasarkan petunjuk jenis.

2.1. Pemeriksa statis

Seperti namanya, pemeriksa tipe statis memeriksa kode Anda secara statis, dengan kata lain, ia memeriksa tipe input fungsi Anda jika panggilan fungsi tersebut sudah ada di basis kode Anda.

MyPy (14,4k bintang di GitHub) mungkin adalah alat yang paling populer dari jenis ini, dengan beberapa alternatif, termasuk Pyright, Pytype, dan Pyre.

Misalnya, jika kita memiliki skrip yang memanggil fungsi dengan petunjuk tipe tetapi memiliki tipe input yang tidak valid:

Mypy dapat memindai skrip dan mendeteksi kesalahan ketik. Namun, jika fungsi tersebut dipanggil saat runtime, mypy tidak akan dapat memeriksanya.

Untuk informasi lebih lanjut tentang pemeriksaan dan linting kode statis, ikuti seri saya “Menulis Kode Siap Produksi untuk Ilmu Data”, di mana saya akan membuat artikel tentang topik ini.

2.2. Pemeriksa runtime

Dengan asumsi kami sedang mengembangkan paket Python untuk tim, dan kami ingin memvalidasi tipe input ke fungsi kami saat runtime saat rekan kerja menggunakannya, kami cukup menambahkan dekorator validate_arguments dari Pydantic (bintang 12k di GitHub) ke fungsi kami.

Contoh-contohnya cukup jelas, dan kita dapat melihat bahwa dekorator memeriksa input terhadap petunjuk tipe dan memunculkan ValidationError jika tipenya tidak cocok.

Pydantic bukan satu-satunya yang menawarkan fungsi ini; ada dekorator lain yang mencapai hal yang sama, seperti beartype (1,4k bintang di GitHub).

Namun, pesan kesalahan beartype jelas tidak dapat dibaca seperti yang ada di pydantic.

3. Izinkan tipe arbitrer dengan pydantic

Secara default, dekorator validate_arguments hanya mendukung tipe bawaan Python, tetapi seringkali kita mungkin ingin meneruskan Pandas DataFrame sebagai argumen, dan kita dapat melakukannya dengan mengizinkan tipe arbitrer dalam konfigurasi seperti di bawah ini:

Fungsi contoh ini hanya mengembalikan n baris pertama dari kerangka data, dan kita dapat melihat dari contoh bahwa dekorator validate_arguments sekarang dapat memvalidasi tipe pd.DataFrame juga.

Peringatan: seperti yang dinyatakan dalam dokumentasi resmi, dekorator validasi_argumen dalam versi beta, telah ditambahkan ke pydantic di v1.5 untuk sementara. Itu mungkin berubah di rilis mendatang dan antarmukanya tidak akan konkret hingga v2.

4. (Opsional) Bagaimana cara kerjanya

Jika Anda adalah pengguna Python menengah hingga mahir, maka dua bagian terakhir adalah untuk Anda!

Meskipun perincian terperinci dari kode sumber tentu saja berada di luar cakupan artikel ini, mari kita lihat dua bagian paling mendasar dari teka-teki ini: petunjuk jenis dan input pengguna.

4.1. Petunjuk tipe akses dari atribut fungsi

Jika kita memiliki fungsi dengan petunjuk tipe, kita dapat mengakses informasi tipe dalam atribut __annotations__ fungsi tersebut. Sebagai contoh:

Dan ini digunakan dalam fungsi _typing_extra.get_type_hints di pydantic.

Cuplikan layar kode sumber Pydantic (1/3)

4.2. Petunjuk jenis akses dari tanda tangan fungsi

Kita juga dapat mengakses anotasi dari tanda tangan fungsi dengan modul inspeksi bawaan Python. Sebagai contoh:

Ini juga digunakan di kelas ValidatedFunction di pydantic.

Cuplikan layar kode sumber Pydantic (2/3)

4.3. Akses input pengguna di dekorator

Ini akan mudah dipahami jika Anda memiliki pengalaman dengan dekorator Python. Singkatnya, dekorator adalah (kebanyakan) fungsi yang mengambil fungsi lain sebagai inputnya, melakukan sesuatu tentangnya, dan kemudian mengembalikan fungsi aslinya. Kita dapat menggunakan simbol @ untuk menambahkan dekorator ke suatu fungsi, tetapi sebenarnya itu hanya berarti dekorator mengambil fungsi sebagai inputnya, dan dua metode di bawah ini (baris 13 dan baris 19 — dengan atau tanpa simbol @) adalah setara.

Dalam contoh sederhana ini, my_decorator mencetak pesan sebelum dan sesudah menjalankan fungsi sapaan asli. Tanpa menyelami detail lebih lanjut tentang dekorator, kesimpulan penting di sini adalah bahwa semua argumen (args dan kwargs, dalam contoh ini, “John”) ke fungsi aslinya juga dimasukkan ke dalam dekorator itu sendiri, dan begitulah cara kita mendapatkan pengguna input.

Cuplikan layar kode sumber Pydantic (3/3)

5. (Lanjutan) Ayo implementasikan sendiri!

Setelah mempelajari bagian dasar dari dekorator validate_arguments , mengapa kita tidak mengimplementasikan versi sederhana kita sendiri?

Sempurna! Kami sekarang telah mengimplementasikan dekorator validasi_argumen sendiri, dan seperti yang dapat kami lihat dari contoh yang diberikan, ini berfungsi persis seperti yang kami harapkan. Beberapa poin penting di sini:

Pertama kita gunakan signature(func).parameters (baris 9) untuk mendapatkan nama dan tipe argumen yang diharapkan. Kemudian kita gunakan signature(func).bind(*args, **kwargs) (baris 12–14) untuk membaca semua nama parameter dan nilai ke pemanggilan fungsi, termasuk argumen, argumen kata kunci, dan nilai default Terakhir, periksa semua nilai input terhadap tipe yang diharapkan, dan panggil fungsi asli jika semua tipe valid, jika tidak, naikkan TypeError (baris 19–24)

Anda mungkin telah memperhatikan dekorator @wraps dari functools (modul Python bawaan) di baris 6, yang juga muncul di tangkapan layar ketiga dari kode sumber pydantic di atas. Ini pada dasarnya menyalin metadata (nama, docstring, anotasi, dll.) dari fungsi asli ke dalam pembungkus sehingga kita dapat mempertahankan informasi dalam fungsi asli kita setelah didekorasi, yang merupakan praktik yang baik saat mengembangkan dekorator. Dan pada baris 62–65, kita dapat melihat bahwa metadata misalnya atribut __doc__, __annotations__ dari fungsi get_dataframe_head yang didekorasi dipertahankan, daripada mendapatkan metadata dari pembungkusnya.

Tentu saja, saya tidak mengharapkan implementasi saya yang disederhanakan untuk mengalahkan pydantic’s, yang jauh lebih detail dan telah diuji dengan berbagai kasus edge, namun demikian, saya harap Anda menemukan ini berguna dan telah mempelajari sesuatu yang baru atau mendapatkan beberapa inspirasi. (Yang mengatakan, dekorator sederhana kami benar-benar berfungsi cukup baik dalam banyak kasus yang akan kami temui, tetapi di bawah ini hanyalah contoh dari tes kasus tepi — classmethod — bahwa dekorator pydantic lolos dan dekorator kami gagal.)

Cuplikan layar tes Pydantic

Selamat membuat kode!

Terima kasih telah membaca dan umpan balik Anda sangat diharapkan. Anda juga dapat mengikuti atau terhubung dengan saya di LinkedIn, tempat saya membuat tagar #100ArticlesForDS (100 Artikel untuk Ilmuwan Data) untuk membagikan artikel ilmu data yang menurut saya berwawasan dan bermanfaat, di samping komentar, pemikiran, dan tip praktis tambahan saya.

A One-liner That Validates Input Types to Your Functions At Runtime awalnya diterbitkan di Towards AI on Medium, di mana orang melanjutkan percakapan dengan menyorot dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jeffrey Hayes