Perintah dan cakupan
Python 3.14 menambahkan annotationlib untuk mengambil anotasi ketika evaluasi ditangguhkan. Pemuat harus mendukung referensi ke depan, menghindari eksekusi ekspresi anotasi sembarang selama penemuan, dan menyediakan jalur kompatibilitas untuk versi Python yang lebih lama. Keterampilan intinya adalah introspeksi runtime dan pengendalian efek samping, jadi ini adalah pertanyaan coding.
Apa yang dinilai oleh pewawancara
Jawaban yang kuat membedakan pengambilan anotasi dari evaluasinya. Mereka memilih VALUE, FORWARDREF, atau STRING berdasarkan konsumen, mengisolasi kegagalan, dan mendefinisikan kapan kode tepercaya boleh dievaluasi. Mereka juga menangani pembatalan cache, pemuatan ulang modul, alias tipe bersarang, dan fallback berversi alih-alih mengandalkan atribut pribadi interpreter.
Pertanyaan klarifikasi awal
- Apakah pemuat memeriksa kode aplikasi tepercaya atau plugin pihak ketiga?
- Apakah pembuat skema memerlukan objek runtime, string, atau referensi yang belum teratasi?
- Versi Python mana saja yang harus tetap didukung?
- Apakah ekspresi anotasi diizinkan untuk mengimpor modul atau memanggil fungsi?
- Bagaimana kegagalan dilaporkan, di-cache, dan dicoba kembali setelah plugin dimuat ulang?
- Apakah data anotasi merupakan bagian dari kontrak kompatibilitas publik?
Kerangka jawaban 30 detik
“Saya akan berhenti memanggil fungsi bantuan yang selalu mengevaluasi anotasi. Pada Python 3.14, saya akan menggunakan annotationlib.get_annotations() dengan Format.FORWARDREF atau Format.STRING untuk penemuan yang tidak tepercaya, dan mencadangkan Format.VALUE untuk fase tepercaya yang eksplisit. Saya akan menormalkan hasil ke dalam skema internal, mengisolasi kegagalan per objek, dan mempertahankan fallback berpagar versi untuk Python yang lebih lama. Pengujian akan mencakup referensi ke depan, impor opsional, alias bersarang, pemuatan ulang, dan pelaporan kesalahan yang deterministik.”
Jawaban langkah demi langkah
Langkah 1: Pisahkan penemuan dari evaluasi
Definisikan dua fase: penemuan mencatat nama atau objek ForwardRef tanpa menyelesaikannya; resolusi hanya berjalan untuk modul dan simbol yang disetujui. Ini mencegah penemuan skema mengimpor dependensi opsional atau mengeksekusi ekspresi hanya karena ekspresi tersebut dianotasikan.
Langkah 2: Pilih format anotasi
Gunakan Format.STRING saat skema memerlukan teks seperti sumber aslinya, Format.FORWARDREF saat nama yang belum teratasi harus tetap terstruktur, dan Format.VALUE hanya saat objek runtime diperlukan dan evaluasi bersifat tepercaya. Perlakukan pilihan format sebagai bagian dari kontrak API pemuat.
Langkah 3: Batasi kegagalan dan efek samping
Tangkap kesalahan resolusi per callable atau kelas, lampirkan jalur objek dan format ke diagnostik, dan lanjutkan penemuan plugin independen. Jangan diam-diam mengubah referensi yang belum teratasi menjadi Any; itu menyembunyikan kecacatan kompatibilitas. Terapkan daftar izin (allowlist) sebelum mengevaluasi impor atau simbol.
Langkah 4: Tambahkan kompatibilitas berversi
Pada Python 3.14+, gunakan API annotationlib yang terdokumentasi. Pada versi yang lebih lama, gunakan lapisan kompatibilitas proyek yang sudah ada dan dokumentasikan jaminan yang lebih lemah. Hindari __annotate__ privat atau internal interpreter sebagai antarmuka jangka panjang.
Langkah 5: Uji determinisme dan siklus hidup
Uji anotasi yang mereferensikan definisi berikutnya, modul yang hilang, alias generik bersarang, string, dan pemuatan ulang modul. Pastikan bahwa penemuan tidak mengimpor modul yang diblokir, bahwa pembacaan berulang menghasilkan skema ternormalisasi yang sama, dan bahwa cache dibatalkan saat identitas atau sumber plugin berubah.
Jawaban model
“Bug tersebut merupakan pelanggaran fase: penemuan mengevaluasi data yang seharusnya hanya mendeskripsikan skema. Saya akan menggunakan API annotationlib Python 3.14 yang terdokumentasi, memilih STRING atau FORWARDREF untuk inspeksi yang tidak tepercaya dan VALUE hanya dalam resolver tepercaya yang eksplisit. Setiap objek mendapatkan diagnostik terisolasi, referensi yang belum teratasi tetap terlihat, dan daftar izin membatasi evaluasi. Adaptor versi mempertahankan perilaku Python yang lebih lama. Pengujian mencakup referensi ke depan, modul opsional yang hilang, alias, pemuatan ulang, impor dengan efek samping, dan output ternormalisasi yang stabil.”
Kesalahan umum
- Selalu mengevaluasi anotasi → impor opsional dan ekspresi berjalan selama penemuan → pisahkan format dan fase.
- Mengubah kegagalan menjadi
Any→ pergeseran skema menjadi tidak terdeteksi → pertahankan referensi yang belum teratasi dan diagnostik. - Menggunakan field interpreter privat → peningkatan versi merusak pemuat → bergantung pada
annotationlibyang terdokumentasi. - Berbagi satu cache global → pemuatan ulang mengembalikan skema basi → beri kunci dan batalkan berdasarkan identitas dan sumber plugin.
- Menyelesaikan setiap plugin dengan hak istimewa penuh → kode yang tidak tepercaya mendapatkan efek samping → gunakan daftar izin dan fase tepercaya.
- Hanya menguji tipe bawaan sederhana → referensi ke depan gagal di produksi → sertakan nama yang hilang dan alias bersarang.
Pertanyaan lanjutan
Pertanyaan lanjutan 1: Kapan VALUE tepat digunakan?
Ketika konsumen membutuhkan objek tipe runtime dan modul serta ekspresi anotasi bersifat tepercaya. Ini harus berupa fase resolusi yang eksplisit, bukan perilaku penemuan bawaan.
Pertanyaan lanjutan 2: Mengapa mempertahankan FORWARDREF alih-alih string?
Ini mempertahankan referensi yang belum teratasi sebagai nilai terstruktur, memungkinkan resolver nantinya membedakan nama yang hilang dari anotasi string biasa.
Pertanyaan lanjutan 3: Apa yang berubah di Python 3.14?
Anotasi ditangguhkan secara default, dan annotationlib menyediakan format yang terdokumentasi untuk mengambilnya. Kode yang mengasumsikan evaluasi langsung harus mendefinisikan format yang diinginkan.
Pertanyaan lanjutan 4: Bagaimana Anda mendukung versi yang lebih lama?
Gunakan adaptor berpagar versi kecil di atas fallback proyek yang sudah ada, dokumentasikan perbedaannya, dan jalankan tes kontrak yang sama pada setiap interpreter yang didukung.