Pengalaman “PEP-302 New Imports Hooks” Python ini [ditutup]

40

Saya salah satu pengembang Ruby (CRuby). Kami sedang mengerjakan rilis Ruby 2.0 (direncanakan untuk rilis 2012 / Februari).

Python memiliki "PEP302: New Import Hooks" (2003):

PEP ini mengusulkan untuk menambahkan satu set kait impor baru yang menawarkan penyesuaian yang lebih baik dari mekanisme impor Python. Berlawanan dengan kait impor saat ini , kait gaya baru dapat disuntikkan ke dalam skema yang ada, memungkinkan untuk kontrol berbutir halus tentang bagaimana modul ditemukan dan bagaimana mereka dimuat.

Kami sedang mempertimbangkan untuk memperkenalkan fitur yang mirip dengan PEP302 ke dalam Ruby 2.0 (CRuby 2.0). Saya ingin membuat proposal yang dapat membujuk Matz. Saat ini, CRuby dapat memuat skrip dari hanya sistem file dengan cara standar.

Jika Anda memiliki pengalaman atau pertimbangan tentang PEP 302, silakan bagikan.

Contoh:

  1. Ini spec yang bagus. Tidak perlu mengubahnya.
  2. Ini hampir baik, tetapi memiliki masalah ini ...
  3. Jika saya bisa kembali ke 2003, maka saya akan mengubah spek untuk ...
Koichi Sasada
sumber
6
Wow, pria YARV itu sendiri, halo dan selamat datang di Programer! ;) Di Stack Exchange kami benar-benar tidak suka diskusi terbuka, kami suka menyelesaikan masalah khusus (berikan bacaan cepat ke FAQ kami ) - yang saya duga adalah mengapa pertanyaan Anda ditutup pada Stack Overflow dan sudah memiliki tutup suara di sini. Anda harus mencobanya untuk membuat ini sedikit lebih spesifik - apakah Anda memiliki perhatian khusus tentang PEP 302 yang memotivasi pertanyaan ini?
yannis
4
Terima kasih atas komentar Anda, Yannis. Saya rasa saya ingin membahas tentang "arsitektur perangkat lunak". PEP302 tampaknya kerangka kerja yang kuat dan umum untuk memperluas loader mereka sendiri pada interpreter python. Namun, fitur yang kuat memiliki risiko seperti terlalu sering menggunakan (menghasilkan kode magis), mencegah optimalisasi juru bahasa. Jadi saya ingin tahu kerangka kerja ekstensi ini manis atau tidak untuk pengguna python dan pengembang interpreter. Saya percaya mempelajari sejarah akan membantu saya membuat spec yang bagus di Ruby 2.0.
Koichi Sasada
Terima kasih memodifikasi pertanyaan saya dengan cantik. Dan saya minta maaf jika pertanyaan ini tidak disukai.
Koichi Sasada
Ini adalah contoh fantastis tentang bagaimana pertanyaan yang muncul, di permukaan, untuk gagal dalam tes "jajak pendapat" kami, tetap dapat membuktikan memiliki nilai luar biasa.
Ross Patterson

Jawaban:

47

Saya pengelola modul runpy Python, dan salah satu pengelola sistem impor saat ini. Walaupun sistem impor kami sangat fleksibel, saya menyarankan agar tidak menggunakannya secara grosir tanpa membuat beberapa perubahan - karena masalah kompatibilitas ke belakang, ada banyak hal yang lebih canggung daripada yang seharusnya diperlukan.

Satu hal yang menyakitkan dengan PEP 302 dalam Python adalah berapa lama kami mengkonversi sistem impor inti untuk menggunakannya. Untuk bagian yang lebih baik dari satu dekade, siapa pun yang melakukan sesuatu yang kompleks dengan kait impor telah terjebak menerapkan dua bagian: satu menangani pemuat yang sesuai PEP 302 (seperti impor zip), dan yang kedua menangani mekanisme impor berdasarkan sistem file standar. Hanya dalam 3.3 yang akan datang bahwa penanganan loader PEP 302 juga akan menangani modul penanganan yang diimpor melalui mekanisme impor sistem file standar. Cobalah untuk tidak mengulangi kesalahan itu jika Anda bisa menghindarinya.

PEP 420 (diimplementasikan untuk Python 3.3) membuat beberapa tambahan pada protokol untuk memungkinkan importir berkontribusi bagian ke paket namespace. Itu juga memperbaiki masalah penamaan dalam definisi Finder API (secara efektif mengganti "find_module" yang salah dengan yang lebih akurat "find_loader"). Semoga ini semua harus didokumentasikan dengan lebih jelas dalam spesifikasi bahasa pada saat 3.3rc1 berputar dalam beberapa minggu.

Masalah penting lainnya adalah bahwa pendekatan yang didokumentasikan secara khusus dalam PEP 302 memiliki terlalu banyak proses negara global. Jangan ikuti kami sepanjang jalan itu - cobalah untuk merangkum keadaan dalam model objek yang lebih koheren sehingga sedikit lebih mudah untuk mengimpor modul lain secara selektif (modul ekstensi C adalah kutukan untuk membuat enkapsulasi semacam itu sepenuhnya efektif, tetapi bahkan beberapa tingkat enkapsulasi dapat membantu).

PEP 406 (http://www.python.org/dev/peps/pep-0406/) membahas kemungkinan evolusi yang kompatibel dari pendekatan Python dengan peningkatan enkapsulasi keadaan. Jika Anda memiliki model keadaan terenkapsulasi dari awal, maka Anda dapat mendefinisikan API Anda sesuai dan menghindari importir dan pemuat mengakses keadaan global sama sekali (alih-alih memberikan referensi ke mesin aktif).

Bagian lain yang hilang dalam PEP 302 adalah kemampuan untuk meminta importir untuk iterator atas modul yang disediakan oleh importir itu (ini diperlukan untuk hal-hal seperti utilitas pembekuan dan utilitas dokumentasi otomatis yang mengekstraksi dokumen). Karena ini sangat berguna, Anda mungkin akan lebih baik membakukannya dari awal: http://docs.python.org/dev/library/pkgutil#pkgutil.iter_modules (mungkin kita akhirnya akan meningkatkan ini ke yang ditentukan secara formal API dalam Python 3.4)

Dan komentar terakhir saya adalah Anda harus memperhatikan dengan seksama pembagian tanggung jawab antara sistem impor dan objek loader. Secara khusus, pertimbangkan untuk memecah API "load_module" menjadi langkah "init_module" dan "exec_module" yang terpisah. Itu akan memungkinkan Anda untuk meminimalkan sejauh mana loader perlu berinteraksi langsung dengan negara impor.

PEP 302 dan importlib adalah titik awal yang bagus untuk sistem impor yang lebih fleksibel, tetapi pasti ada kesalahan yang kami buat yang harus dihindari.

ncoghlan
sumber
1
Mereka tidak cukup selesai, tapi sebuah draft awal dari dokumentasi sistem impor lengkap bisa dilihat di docs.python.org/dev/reference/import
ncoghlan
1
python.org/dev/peps/pep-0451 adalah pembaruan untuk sistem impor Python untuk Python 3.4 yang membahas banyak komentar dari Brett dan saya di sini.
ncoghlan
28

Di sebelah ncoghlan saya adalah pengelola lain sistem impor Python dan penulis penerapannya saat ini, importlib (http://docs.python.org/dev/py3k/library/importlib.html). Semua yang dikatakan Nick saya setujui, jadi saya hanya ingin menambahkan beberapa info tambahan.

Pertama, jangan terlalu mengandalkan PEP 302 secara langsung tetapi lihat apa yang importlib berikan dalam hal kelas dasar abstrak, dll. Untuk kompatibilitas mundur hal-hal harus kompatibel dengan PEP 302, tetapi saya harus menambahkan beberapa dari saya API sendiri untuk menyelesaikan penyempurnaan dukungan untuk fleksibilitas sejati.

Poin penting lainnya adalah Anda memberi pengembang dua fleksibilitas. Salah satunya adalah kemampuan untuk menyimpan kode dengan cara selain hanya langsung pada sistem file sebagai file individual (saya menyebutnya penyimpanan back-end untuk impor), mis. Ini memungkinkan kode untuk hidup dalam file zip, database sqlite, dll Dukungan lainnya adalah memungkinkan kontrol untuk kode pra atau pasca proses dalam beberapa cara, misalnya Quixote (https://www.mems-exchange.org/software/quixote/) dan penggunaan alternatif string literal yang tidak ditugaskan untuknya. suatu variabel akan jauh lebih mudah untuk didukung.

Sementara yang terakhir jarang diperlukan, yang pertama adalah di mana Anda harus khawatir tentang dukungan. Dan di sinilah Anda akhirnya mendefinisikan ulang API interaksi sistem file. Karena beberapa orang memerlukan aset yang disimpan sebagai file dengan kode mereka, Anda perlu menyediakan cara yang baik untuk membaca file, menemukan file, dll. Kita masih perlu mengimplementasikan bagian API untuk menemukan file data apa yang tersedia, mendaftar, dll. .

Tapi kemudian Anda juga membutuhkan API yang spesifik kode. Seperti yang disebutkan Nick, Anda pada akhirnya membutuhkan API untuk menemukan modul apa saja yang terkandung dalam paket, dll. Yang tidak khusus untuk file. Ada dualitas aneh memiliki API untuk berurusan dengan modul di mana Anda telah mengekstraksi konsep file, tetapi akhirnya Anda harus menyediakan API untuk mengakses data aset seperti file. Dan segera setelah Anda mencoba menerapkan satu dalam hal yang lain untuk menghindari duplikasi air menjadi benar-benar suram (yaitu orang akhirnya bergantung pada penataan jalur file yang diharapkan, dll. Tanpa memperhatikan fakta bahwa jalan tersebut mungkin bukan jalan yang benar karena ini untuk kode zip yang berisi dan bukan hanya file). TKI Anda pada akhirnya harus mengimplementasikan dua API serupa, tetapi Anda akan lebih baik dalam jangka panjang.

Seperti kata Nick, solusi kami adalah titik awal yang baik, tetapi bukan bagaimana saya akan melakukannya hari ini jika saya merancang API dari awal.

Brett Cannon
sumber
-1

PEP 302 memungkinkan Anda untuk menghubungkan ke mekanisme impor Python, yang berarti bahwa Anda dapat mengimpor kode dari sumber lain seperti database, file zip dan sebagainya.

Dalam implementasi impor Python ada sejarah panjang kompleksitas yang hanya akan segera disederhanakan dengan pengenalan implementasi impor Python.

Saya harus menyarankan berpikir panjang dan keras tentang kasus sudut. Maka Anda cenderung mendapatkan implementasi yang bermanfaat.

holdenweb
sumber