Pada hari yang lain, semasa saya melihat pangkalan data kelemahan dalam pakej Python, saya menyedari bahawa beberapa versi pakej di sana tidak dapat dihuraikan dengan mudah dan dibandingkan dengan rentetan versi lain kerana ia tidak mematuhi piawaian Versi Python - sama ada PEP 440 lama atau spesifikasi Versi Specifiers yang menggantikannya. Jadi saya mula tertanya-tanya betapa biasa ini. Berapa banyak pakej pada Indeks Pakej Python sebenarnya mempunyai versi yang sah?
Jawapan yang jelas ialah: pergi semak. Jadi saya mencipta persekitaran maya baharu, memuat turun permintaan dan terus menulis skrip berbilang pemprosesan untuk menanyakan API PyPI secara literal setiap rentetan versi yang digunakan oleh setiap pakej . Saya mengambil masa beberapa jam walaupun berjalan pada semua teras tetapi pada penghujungnya saya telah mendapatkan lebih 6,057,703 rentetan versi daripada 545,018 pakej, disimpan dalam pangkalan data SQLite yang kemas. Anda boleh menemuinya di Kaggle.
Seterusnya ialah penghuraian. Saya menemui dua perpustakaan yang berjanji untuk mengesahkan rentetan versi untuk pematuhan:
Perhatikan bahawa untuk bersikap adil, kedua-dua ini masih berpegang pada PEP-440, yang kini telah diganti, jadi saya akan mengingatinya, terutamanya apabila melihat rentetan yang ditandakan sebagai tidak patuh.
Selepas beberapa jam lagi berbilang pemprosesan yang sengit, saya telah mengemas kini pangkalan data saya dengan dua lajur boolean yang menunjukkan sama ada rentetan berjaya dihuraikan dengan kedua-dua pakej ini (juga pada Kaggle).
Untuk ringkasan ringkas penemuan saya:
daripada 6,057,703 rentetan versi, 5,542 (0.09%) didapati rosak;
daripada 545,018 pakej, 1,285 (0.24%) mempunyai sekurang-kurangnya satu rentetan versi yang rosak.
Jadi secara keseluruhan keadaan repositori kelihatan agak sihat! Rentetan versi yang didapati salah oleh kedua-dua perpustakaan adalah dari semua jenis. Sesetengahnya hanya menggunakan imbuhan dengan cara yang tidak standard tetapi secara keseluruhannya mengikut paradigma versi semantik manakala yang lain hanya melakukan cincangan atau rentetan perkataan dan nombor.
Kes di mana kedua-dua perpustakaan tidak bersetuju adalah lebih menarik. Ini adalah yang pepver tidak mengesahkan tetapi parver lakukan:
0.0.2.R 0.0.2.R3 0.0.2.R4 0.0.2.R5 0.0.2.R6 0.0.2.R7
Dalam kes ini, saya akan mengatakan lada adalah salah. Mengikut PEP440 dan peraturan versi semasa, r ialah ejaan yang boleh diterima untuk teg selepas keluaran (standard untuk menyiarkan), dan huruf tidak peka huruf besar-kecil. Jadi dengan berkesan 0.0.2.R3 menormalkan kepada 0.0.2.post3 dan sah dengan sempurna.
Sementara itu, berikut ialah sampel rawak versi yang diakui oleh pepver tetapi tidak oleh parver:
0.0.1dev-20141025 1.5.0-dev-618 0.3.4.dev.20180830 1.15.0-dev-1552 1.4.0-dev-510 0.0.9.dev-20121012 0.2dev-20101203 0.3.4.dev.20180905 1.15.0-dev-1606 0.2.1dev-20110627 1.12.0-dev-1379 1.1.1-dev-275 1.3.1-dev-427
Mereka semua mempunyai kecenderungan yang sama untuk menggunakan nombor lain (kadangkala tarikh) selepas akhiran dev, dengan beberapa pemisah. Ini sememangnya salah, kerana spesifikasi tidak membenarkan pemisah dalam kes ini. Jadi sekali lagi parver nampaknya betul.
Apa pun, itu cukup memuaskan rasa ingin tahu saya yang asal, dan meyakinkan saya bahawa untuk kebanyakan kes, kaedah standard menghuraikan dan membandingkan versi akan mencukupi. Malah dalam kalangan versi bukan standard selalunya agak mudah untuk mengenal pasti pesanan, kerana sisihan adalah minimum. Namun, adalah berguna untuk mengetahui semua keanehan versi rasmi dan mengetahui bila kita boleh atau tidak boleh bergantung padanya.
Atas ialah kandungan terperinci Berapa banyak pakej Python yang diversi dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!