Mengapa orang ragu menggunakan Python 3?

221

Python 3 dirilis pada Desember 2008. Banyak waktu telah berlalu sejak itu tetapi masih hari ini banyak pengembang ragu untuk menggunakan Python 3. Bahkan kerangka kerja populer seperti Django belum kompatibel dengan Python 3 namun masih bergantung pada Python 2.

Tentu saja, Python 3 memiliki beberapa ketidakcocokan dengan Python 2 dan beberapa orang perlu mengandalkan kompatibilitas ke belakang. Tapi bukankah Python 3 sudah ada cukup lama sekarang untuk sebagian besar proyek untuk beralih atau mulai dengan Python 3?

Memiliki dua versi yang bersaing memiliki banyak kelemahan; dua cabang perlu dipertahankan, kebingungan untuk peserta didik dan sebagainya. Jadi mengapa ada begitu banyak keraguan di seluruh komunitas Python tentang beralih ke Python 3?

Ham Vocke
sumber
3
Apakah ada begitu banyak proyek baru yang mulai menggunakan Python 2? Atau hanya proyek lama seperti Django?
Carson63000
3
Bisakah Anda mengutip beberapa diskusi / sumber?
Michael Easter
12
@Michael Easter - Dia tidak harus. Cukup periksa tag python pada SO; banyak orang di sana berpendapat "belajar 2.x, 3.x belum siap".
Benteng
5
Pernahkah Anda melihat Python 3 Wall of Shame ?
detly
7
@detly, sekarang panggil Python 3 Wall of Superpower
freeforall tousez

Jawaban:

249

Perhatikan bahwa saya tidak lagi memperbarui jawaban ini. Saya memiliki tanya jawab Python 3 yang lebih lama di situs pribadi saya di http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html

Jawaban sebelumnya:

(Pembaruan status, September 2012)

Kami (yaitu pengembang inti Python) memperkirakan ketika Python 3.0 dirilis bahwa akan memakan waktu sekitar 5 tahun untuk 3.x untuk menjadi pilihan "default" untuk proyek-proyek baru di atas seri 2.x. Prediksi itu adalah mengapa periode pemeliharaan yang direncanakan untuk rilis 2.7 begitu lama.

Rilis asli Python 3.0 juga ternyata memiliki beberapa masalah kritis dengan kinerja IO yang buruk yang membuatnya tidak dapat digunakan untuk sebagian besar tujuan praktis, sehingga lebih masuk akal untuk memulai timeline dari rilis Python 3.1 pada akhir Juni, 2009. (Mereka Masalah kinerja IO juga merupakan alasan mengapa tidak ada rilis pemeliharaan 3.0.z: tidak ada alasan bagus bagi siapa pun yang ingin tetap menggunakan 3.0 untuk meningkatkan ke 3.1).

Pada saat penulisan (September 2012), itu berarti kami saat ini sedikit lebih dari 3 tahun ke dalam proses transisi, dan prediksi itu tampaknya masih berada di jalurnya.

Sementara orang mengetik kode Python 3 paling sering digigit oleh perubahan sintaksis seperti printmenjadi fungsi, yang sebenarnya tidak merepotkan untuk porting perpustakaan karena 2to3alat konversi otomatis menanganinya dengan cukup bahagia.

Masalah terbesar dalam praktik sebenarnya adalah masalah semantik: Python 3 tidak membiarkan Anda bermain dengan cepat dan longgar dengan penyandian teks seperti halnya Python 2. Ini adalah kedua manfaat terbesarnya dari Python 2, tetapi juga penghalang terbesar untuk porting: Anda harus memperbaiki masalah penanganan Unicode Anda agar port berfungsi dengan benar (sedangkan dalam 2.x, banyak kode yang secara diam-diam menghasilkan data yang salah dengan input non-ASCII, memberikan kesan bekerja, terutama di lingkungan di mana data non-ASCII tidak umum).

Bahkan perpustakaan standar di Python 3.0 dan 3.1 masih memiliki masalah penanganan Unicode, sehingga sulit untuk mem-port banyak perpustakaan (terutama yang terkait dengan layanan web).

3.2 mengatasi banyak masalah itu, memberikan target yang jauh lebih baik untuk perpustakaan dan kerangka kerja seperti Django. 3,2 juga membawa versi kerja pertama wsgiref(standar utama yang digunakan untuk komunikasi antara server web dan aplikasi web yang ditulis dengan Python) untuk 3.x, yang merupakan prasyarat yang diperlukan untuk adopsi di ruang web.

Ketergantungan utama seperti NumPy dan SciPy sekarang telah porting, instalasi dan alat-alat manajemen ketergantungan seperti zc.buildout, pipdan virtualenvtersedia untuk 3.x, rilis Pyramid 1.3 mendukung Python 3.2, rilis Django 1.5 mendatang termasuk dukungan Python 3 eksperimental, dan rilis 12.0 dari kerangka kerja Twisted menjatuhkan dukungan Python 2.5 untuk membuka jalan untuk membuat versi yang kompatibel dengan Python 3.

Selain kemajuan pada pustaka dan kerangka kerja kompatibilitas Python, implementasi interpreter PyPy yang dikompilasi JIT populer secara aktif bekerja pada dukungan Python 3.

Alat untuk mengelola proses migrasi juga meningkat pesat. Selain 2to3alat yang disediakan sebagai bagian dari CPython (yang sekarang dianggap paling cocok untuk konversi satu kali aplikasi yang tidak perlu mempertahankan dukungan untuk seri 2.x), ada juga python-modernize, yang menggunakan 2to3infrastruktur untuk menargetkan subset umum (besar) dari Python 2 dan Python 3. Alat ini membuat basis kode tunggal yang akan berjalan pada Python 2.6+ dan Python 3.2+ dengan bantuan sixpustaka kompatibilitas. Rilis Python 3.3 juga menghilangkan salah satu penyebab utama "noise" ketika memigrasi aplikasi sadar Unicode yang ada: Python 3.3 sekali lagi mendukung awalan 'u' untuk string literal (sebenarnya tidak benar - benar melakukanapa pun di Python 3 - ini baru saja dipulihkan untuk menghindari migrasi secara tidak sengaja ke Python 3 yang lebih sulit bagi pengguna yang telah dengan benar membedakan teks dan literal biner mereka di Python 2).

Jadi kami sebenarnya cukup senang dengan perkembangannya - masih ada hampir 2 tahun lagi untuk kerangka waktu asli kami, dan perubahannya beriak dengan baik melalui seluruh ekosistem Python.

Karena banyak proyek tidak membuat metadata Indeks Paket Python mereka dengan benar, dan beberapa proyek dengan pengelola yang kurang aktif telah bercabang untuk menambahkan dukungan Python 3, scanner PyPI yang murni otomatis masih memberikan pandangan yang terlalu negatif tentang keadaan perpustakaan Python 3 dukung.

Alternatif yang lebih disukai untuk mendapatkan informasi tentang tingkat dukungan Python 3 pada PyPI adalah http://py3ksupport.appspot.com/

Daftar ini secara pribadi dikuratori oleh Brett Cannon (pengembang inti Python lama) untuk memperhitungkan metadata proyek yang salah, dukungan Python 3 yang ada di alat kontrol sumber tetapi belum dalam rilis resmi, dan proyek yang memiliki garpu lebih terkini atau alternatif yang mendukung Python 3. Dalam banyak kasus, perpustakaan yang belum tersedia di Python 3 hilang dependensi kunci dan / atau kurangnya dukungan Python 3 dalam proyek lain mengurangi permintaan pengguna (misalnya setelah kerangka inti Django tersedia di Python 3, alat terkait seperti South dan django-selery lebih mungkin untuk menambahkan dukungan Python 3, dan ketersediaan dukungan Python 3 di Pyramid dan Django membuatnya lebih mungkin bahwa dukungan Python 3 akan diimplementasikan dalam alat lain seperti gevent).

Situs di http://getpython3.com/ mencakup beberapa tautan luar biasa ke buku-buku dan sumber daya lain untuk Python 3, mengidentifikasi beberapa pustaka kunci dan kerangka kerja yang sudah mendukung Python 3, dan juga menyediakan beberapa informasi tentang bagaimana pengembang dapat mencari bantuan keuangan dari PSF dalam porting proyek-proyek utama ke Python 3.

Sumber lain yang bagus adalah halaman wiki komunitas tentang faktor-faktor yang perlu dipertimbangkan ketika memilih versi Python untuk proyek baru: http://wiki.python.org/moin/Python2orPython3

ncoghlan
sumber
3
Diperbarui berdasarkan kemajuan selama 18 bulan terakhir (dan secara eksplisit mencatat fakta bahwa 3,1 adalah rilis 3.x nyata yang layak untuk produksi pertama karena kinerja IO yang sangat buruk di 3.0)
ncoghlan
1
Pada tingkat tertentu (yaitu kita tahu itu jauh lebih lambat daripada subsistem io di 2.6), tetapi dampak pada kegunaan umum jauh lebih buruk daripada yang kita perkirakan (tolok ukur IO kami telah meningkat sejak itu, jadi tidak ada kemungkinan sesuatu seperti itu menjadi dikirim hari ini)
ncoghlan
6
Kerangka waktu yang diusulkan tampaknya tidak begitu antusias sekarang di tahun 2015: |
zetah
1
Cara saya melihatnya (dan saya akan dibakar di tiang pancang oleh beberapa orang untuk ini) adalah bahwa di bagian depan penyandian, Py3 melanggar (dan masih demikian, Zen) dari Python pada titik "pragmatism beats purity" : Py3 adalah penyandian-murni. Py2 adalah encoding-pragmatis.
Jürgen A. Erhard
2
Py3 masih pragmatis tentang penyandian (jika tidak kita tidak akan memiliki surrogateescape), kami hanya menemui banyak pengguna * nix yang tidak tertarik mendengar tentang cara antarmuka sistem operasi bekerja pada platform seperti Windows, .NET dan JVM ( termasuk Android). Saya telah menulis lebih banyak tentang hal itu di developerblog.redhat.com/2014/09/09/... Dampak utama adalah pada bagian "kesalahan tidak boleh berlalu secara diam-diam", karena kami mengubah bug yang bergantung pada data yang menghasilkan mojibake menjadi kesalahan tipe struktural. mengeluh tentang pencampuran data biner dan data teks.
ncoghlan
48

Saya percaya bahwa banyak keraguan berasal dari dua hal:

  • Jika tidak rusak, jangan memperbaikinya
  • [Pustaka XYZ] yang kami butuhkan tidak memiliki port 3.0

Ada beberapa perbedaan dalam cara bahasa inti berperilaku, yang diuraikan dalam dokumen ini . Sesuatu yang sederhana seperti mengubah "cetak" dari pernyataan ke fungsi, misalnya, akan merusak banyak kode Python 2.x - dan itu hanya yang paling sederhana. Mereka menyingkirkan kelas gaya yang lebih tua sepenuhnya di 3.0. Mereka, pada kenyataannya, bahasa yang sangat berbeda - jadi porting kode lama tidak sesederhana yang diasumsikan oleh beberapa orang.

TZHX
sumber
2
Masalah dependensi-tidak-memiliki-pelabuhan bersifat berulang, juga. Apa yang dibutuhkan adalah pustaka yang digunakan secara luas yang memiliki sedikit atau tidak ada ketergantungan di luar stdlib ke port, yang kemudian dapat memulai reaksi berantai.
Tony Meyer
10
Saya akan beralih pesanan. Banyak dari kita yang mondar-mandir, menunggu paket tertentu untuk bermigrasi ke 3.
S.Lott
1
@ Tony - itu sebabnya saya pikir itu adalah anugerah yang bagus untuk 3.0 yang sekarang tersedia untuk Numpy. @ S.Lott - Saya kira itu sangat tergantung pada apakah 3 menawarkan sesuatu yang Anda inginkan. Sejujurnya, saya baru saja pindah dari 2,5 ke 2,7 - jadi saya tidak benar-benar salah satu dari orang-orang yang mengikuti "terbaru dan terhebat".
TZHX
1
Memindahkan kode lama dengan bantuan 2to3tidak sesulit yang ditakutkan oleh beberapa orang.
ncoghlan
5
Itu tidak membantu bahwa hampir setiap OS yang mengikat Python ke distro (OSX, Linux, dll) masih terjebak pada beberapa versi kuno Python 2. Mengapa menulis untuk Python 3 ketika tidak ada yang dapat menggunakan kode Anda tanpa mucking tentang dengan internal OS mereka?
Semut
28

Tidak ada alasan kompulsif bagi bisnis yang ada untuk menghabiskan waktu, uang, dan upaya bermigrasi ke sesuatu sementara tidak ada perubahan pada set fitur yang ada. Maksud saya mengatakan basis kode pada Python 2 series telah berjalan dan berjalan dalam bisnis untuk waktu yang lama, stabil, teruji dan memiliki semua set fitur produk saat ini. Mengapa ada orang yang menghabiskan waktu, uang, dan usaha hanya untuk memindahkan Python 3 hanya demi bermigrasi ke sana.

Selain itu pasca migrasi memastikan tidak ada kegagalan regresi dan semua sakit kepala tidak dapat dihindari.

Untuk proyek-proyek baru, kebijakannya sederhana dan sederhana, semuanya dimulai pada poin-poin berikut:

  1. Apakah ada distro seperti Ubuntu yang mengirimkan Python 3 dalam instalasi default mereka?
  2. Apa ekosistem perpustakaan untuk Python 3.
  3. Apakah semua kerangka kerja kompatibel dengan Python 3. dll.

Ini adalah proses 'memilih bahasa baru' seperti biasa. Di sinilah masalah ayam-telur masuk, Tidak banyak orang yang menggunakannya karena tidak banyak orang yang menggunakannya. Pada akhirnya tidak ada yang merasa ingin pindah sama sekali.

Melanggar kompatibilitas tidak pernah menjadi hal yang baik, pada akhirnya Anda selalu mengakhiri persentase pengguna yang baik.

kamaal
sumber
14

Sekitar waktu Python 2.0 dirilis, popularitas Python berkembang pesat. Ada banyak pengguna baru yang secara alami menggunakan versi terbaru, karena mereka tidak bergantung pada versi yang lebih lama. Dengan banyak orang mengadopsi 2.0 secara default, ada banyak tekanan pada pengembang perpustakaan dll.

Pada saat Python 3.0 dirilis, sudah ada sejumlah besar pengguna bergantung pada Python 2.0, dan pertumbuhan eksponensial (menjaga faktor konstan relatif terhadap pengguna yang ada) jelas tidak dapat dipertahankan tanpa batas waktu.

Secara pribadi, fitur-fitur baru di Python 2 hari tampak jauh lebih menarik daripada yang disediakan oleh Python 3.

Saya dulu berpikir Python 3 akhirnya akan mengambil alih, tapi saya tidak begitu yakin sekarang. Tapi bukan hanya Python yang memiliki masalah ini. Lagi pula, berapa banyak orang yang secara jujur ​​menggunakan Perl 6? Itu sudah ada sedikit lebih lama dari Python 3, IIRC.

Steve314
sumber
3
Sial, saya masih menggunakan Fortran77. :) Dan sebagian besar "fitur" nyata dari Python 3 telah di-backport ke 2.6 dan 2.7, tanpa banyak masalah kompatibilitas. Satu-satunya hal Python 3 benar-benar menawarkan adalah "bersih" sintaks.
TZHX
3
Membandingkan Python 3 dan Perl 6 salah. Python 3 adalah lompatan tambahan dari Python 2 sedangkan Perl 6 adalah desain ulang total ke atas. Perl 5 dan Perl 6 adalah bahasa sejenis dan akan terus ada untuk waktu yang lama. Di sisi lain, Python 3 berencana untuk mengganti Python 2, tidak hanya ada. Ini perbedaan besar.
kamaal
1
Perl 6 masih dalam pengembangan. Ya, Rakudo Perl adalah implementasi yang paling dekat dengan spesifikasi Perl 6 tetapi belum mengimplementasikan semuanya. Hanya belum ada implementasi Perl 6 yang siap produksi.
Htbaa
1
@ Htbaa untuk banyak definisi kelengkapan dan kesiapan. Perl 6 selesai dan produksi siap. Masalahnya adalah mungkin perlu waktu untuk mencocokkan spesifikasi lengkap, ada hal-hal serupa dengan bahasa lain juga. Sebagai contoh, GCC bahkan hingga saat ini tidak sepenuhnya cocok dengan seluruh spesifikasi C ++. Desain dan implementasi bahasa adalah proses yang sangat lambat.
kamaal
1
rakudo.org/node/75 Bintang rakudo dirilis lama. Anda harus mencobanya.
kamaal
11

Sebuah penghenti acara besar bagi saya, yang saya pikir tidak dapat diatasi dengan terjemahan otomatis, adalah pembagian integer. Saya memiliki kode ilmiah yang mengandalkan x / 2 memberikan x dibulatkan (ketika x adalah bilangan bulat).

Python 3 tidak akan melakukan itu, tetapi akan memberikan jawaban .5 (untuk x aneh).
Saya tidak bisa hanya mengganti semua / dalam kode saya dengan // karena kadang-kadang saya melakukan pembagian float, dan ingin perilaku float.

Jadi, bagi saya untuk port ke python 3, saya harus menjaring melalui puluhan ribu baris kode, memeriksa setiap /, dan melihat apakah saya bisa mengetahui apakah itu harus / atau //.

Sharky
sumber
7
Opsi "-Q" (2,2 hingga 2,7) dapat meningkatkan peringatan untuk pembagian. Juga, fixdiv.py menggunakan peringatan ini untuk memperbarui ekspresi dalam skrip Anda.
Eryk Sun
10

Python 3 bagus untuk memulai proyek baru jika semua perpustakaan yang Anda butuhkan sudah porting ke Py3k.

Jika ini bukan opsi, menggunakan Python 2.7 adalah yang terbaik dari kedua dunia: Anda memiliki hampir semua perpustakaan yang dibuat untuk Python 2.x dan Anda secara bertahap dapat mengubah kode Anda agar kompatibel dengan Py3k, sehingga migrasi mudah ketika Anda memutuskan saya t. Daftar barang sintaks dari Py3k yang sudah Anda miliki di 2.7 agak panjang, tapi jangan lupa untuk mengimpornya __future__. Favorit saya adalah Unicode secara default dan divisi selalu menghasilkan float.

9000
sumber
10

Dari perspektif layanan web: Tidak ada kerangka kerja server utama atau kerangka kerja web yang mendukung Python3.

Pembaruan: Jelas itu yang terjadi di awal 2011, sampai sekarang (akhir 2013), sebagian besar kerangka kerja utama bekerja dengan Python3. Namun beberapa masih tidak kompatibel. Contoh yang signifikan adalah Twisted, yang masih berfungsi .

vartec
sumber
BTW, Django baru saja mulai secara eksperimental mendukung Python3, dalam v 1.5.
9000
1
Django 1.6 sekarang secara resmi mendukung Python 3. Flask juga mendukungnya.
chhantyal
8

Tidak ada alasan kuat yang saya lihat menggunakan P3K kecuali Anda sedang melakukan pekerjaan berat. Dalam forays saya, saya telah menemukan Unicode meresap menjadi penghalang untuk pekerjaan (ASCII) saya dan generator wajib untuk menyumbat kode saya.

Dalam beberapa tahun, 3 akan menghadirkan lingkungan yang lebih menarik, tetapi, tidak hari ini.

Paul Nathan
sumber
4

Distribusi tidak membuat Python3 tersedia. Ada beberapa distro pinggiran yang sudah transisi dari Python2. Tetapi varian Linux arus utama seperti Debian, Ubuntu dll. Tidak. Itulah alasan utama saya sebagai penulis aplikasi untuk tidak melakukan keduanya.

Meskipun saya menyiapkan transisi dan bahkan mencoba untuk menghindari konstruksi sintaks yang tidak kompatibel , saya tidak dapat mengujinya dengan benar. Itu bermuara pada masalah ayam dan telur benar-benar.

mario
sumber
4
Ini mungkin benar sekali, tetapi "apt-get install python3" dan "yum install python3" telah bekerja untuk waktu yang lama. Alat-alat seperti racun dan layanan seperti Shining Panda CI membuatnya lebih mudah untuk menguji di beberapa versi Python.
ncoghlan
Sekarang banyak distro ini menginstal python3 secara default, tidak seperti banyak bahasa pemrograman lainnya.
Antti Haapala