İnsanlar neden Python 3'ü kullanmakta tereddüt ediyorlar?


221

Python 3 Aralık 2008'de piyasaya sürüldü. O zamandan bu yana çok zaman geçti ama bugün hala birçok geliştirici Python 3'ü kullanmakta tereddüt ediyor. Django gibi popüler çerçeveler bile Python 3 ile uyumlu değil, yine de Python 2'ye güveniyor.

Elbette, Python 3, Python 2 ile bazı uyumsuzluklara sahip ve bazılarının geriye dönük uyumluluğa güvenmesi gerekiyor. Ancak Python 3, çoğu projenin Python 3 ile geçiş yapması veya başlaması için şimdiye kadar yeterince uzun sürmedi mi?

İki rakip versiyona sahip olmanın birçok sakıncası var; İki dalın korunması, öğrenciler için karışıklık vb. Öyleyse neden Python topluluğu genelinde Python 3'e geçiştirmek konusunda bu kadar tereddüt var?


3
Python 2'yi kullanmaya başlayan çok yeni projeler var mı? Yoksa Django gibi uzun zamandır kurulmuş projeler mi?
Carson63000,

3
Bazı tartışmalardan / kaynaklardan bahsedebilir misiniz?
Michael Easter

12
@Michael Easter - O zorunda değil. Sadece SO üzerindeki python etiketini kontrol edin; Yukarıda bir çok insan "2.x öğren, 3.x henüz hazır değil" görüşünde.
Rook

5
Python 3 Utanç Duvarı'nı görmediniz mi?
12'de

Yanıtlar:


249

Bu cevabı artık güncellemediğimi unutmayın. Kişisel sitemde http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html adresinde çok daha uzun süredir Python 3 Soru ve Cevaplarım var

Önceki cevap:

(Durum güncellemesi, Eylül 2012)

Biz (yani Python çekirdek geliştiricileri) Python 3.0'ın piyasaya sürüldüğü zaman, 3.x'in 2.x serisindeki yeni projeler için "varsayılan" tercih haline gelmesinin yaklaşık 5 yıl alacağını öngörmüştük. Bu tahmin, 2.7 sürümü için planlanan bakım süresinin bu kadar uzun olmasının nedenidir.

Orijinal Python 3.0 sürümü aynı zamanda, çoğu IO performansında etkili bir şekilde kullanılamaz kılan, düşük IO performansı ile ilgili bazı kritik sorunların ortaya çıktığı için, bu yüzden, Haziran 2009'un sonlarında Python 3.1'in piyasaya sürülmesinden itibaren zaman çizelgesini başlatmak daha mantıklı geliyor. (Bunlar GÇ performans sorunları, 3.0.z bakım bültenlerinin olmamasının da nedenidir: kimsenin 3.0'a yükseltme yerine 3.0'a bağlı kalmak istemesi için iyi bir sebep yoktur).

Yazma zamanında (Eylül 2012), bu şu anda geçiş sürecine 3 yıldan biraz fazla kaldığımız ve bu tahminin hala devam ettiği görülüyor.

İnsanlar iken yazarak Python 3 kod en düzenli gibi sözdizimsel değişikliklerden ısırılmaktadır printotomatikleştirilmiş çünkü aslında kütüphane taşınması için bir güçlük olmadığını, bir fonksiyon haline 2to3dönüştürme aracı oldukça mutlu o işler.

Uygulamadaki en büyük problem aslında anlamsal bir problem: Python 3, Python 2'nin yaptığı gibi metin kodlamaları ile hızlı ve gevşek oynamanıza izin vermiyor. Bu, hem Python 2'ye göre en büyük avantajı, hem de taşıma için en büyük engeldir: bir limanın doğru çalışması için Unicode işleme sorunlarını düzeltmeniz gerekir (2.x'te, bu kodun çoğu sessizce yanlış veri üretti. ASCII olmayan girişler, özellikle ASCII dışı verilerin nadir olduğu ortamlarda çalışma izlenimi verir).

Python 3.0 ve 3.1'deki standart kütüphanelerde bile Unicode kullanım sorunları vardı, bu da birçok kütüphanenin (özellikle web servisleriyle ilgili olanlar) taşınmasını zorlaştırdı.

3.2, Django gibi kütüphaneler ve çerçeveler için daha iyi bir hedef sağlayarak bu sorunların çoğuna değindi. 3.2 ayrıca wsgirefweb ortamında benimsenmesi için gerekli bir önkoşul olan, 3.x için (web sunucuları ve Python ile yazılmış web uygulamaları arasında iletişim için kullanılan ana standart) ilk çalışma versiyonunu da getirdi .

Numpy ve SciPy gibi anahtar bağımlılıkları şimdi de geliştirilmektedir, montaj ve bağımlılık yönetimi araçları gibi zc.buildout, pipve virtualenv3.x için mevcuttur, Piramit 1.3 sürüm Python 3.2, yaklaşan Django 1.5 sürümünde deneysel Python 3 desteği içerir destekler ve 12.0 serbest bırakma arasında Twisted networking framework, Python 3 uyumlu bir sürüm oluşturmanın yolunu açmak için Python 2.5 desteğini bıraktı.

Python 3 uyumluluk kitaplıkları ve çerçevelerinde ilerlemeye ek olarak, popüler JIT-derlenmiş PyPy tercüman uygulaması aktif olarak Python 3 desteği üzerinde çalışıyor.

Geçiş sürecini yönetmek için araçlar da belirgin bir şekilde iyileşmiştir. 2to3CPython'un bir parçası olarak sunulan araca ek olarak (şu anda 2.x serisi için desteğini sürdürmesi gerekmeyen uygulamaların tek seferlik dönüşümleri için en uygun olanı olarak kabul edilir), ayrıca python-modernize, 2to3hedeflenen alt yapıyı kullanan Python 2 ve Python 3'ün (büyük) ortak alt kümesi. Bu araç, sixuyumluluk kütüphanesinin yardımıyla hem Python 2.6+ hem de Python 3.2+ üzerinde çalışacak tek bir kod tabanı oluşturur . Python 3.3 sürümü ayrıca, mevcut Unicode uyumlu uygulamalara geçiş yaparken "gürültünün" önemli bir nedenini de ortadan kaldırır: Python 3.3, dize değişmezleri için 'u' önekini bir kez daha destekler (aslında yapmaz)Python 3'teki herhangi bir şey - yanlışlıkla Python 2'deki metinlerini ve ikili harfleri ayırt eden kullanıcılar için yanlışlıkla Python 3'e geçişi zorlaştırmamak için geri yüklendi ).

Bu yüzden işlerin nasıl yürüdüğü konusunda gerçekten çok mutluyuz - orijinal zaman dilimine devam etmek için hala yaklaşık 2 yıl var ve değişiklikler tüm Python ekosistemi içinde güzelce yayılıyor.

Bir çok proje Python Paket Endeksi meta verilerini doğru şekilde iyileştirmediğinden ve daha az aktif bakıcıya sahip bazı projelere Python 3 desteği eklemek zorunda kaldıklarından, tamamen otomatik olan PyPI tarayıcıları Python 3 kütüphanesinin durumunun aşırı derecede olumsuz bir görüntüsüne sahip destek.

PyPI'deki Python 3 desteği seviyesi hakkında bilgi edinmek için tercih edilen bir alternatif http://py3ksupport.appspot.com/

Bu liste, yanlış proje meta verilerini, kaynak kontrol araçlarında bulunan ancak henüz resmi bir sürümde bulunmayan Python 3 desteğini ve daha güncel çatalları olan projeleri hesaba katan Brett Cannon (uzun süredir Python çekirdek geliştiricisi) tarafından kişisel olarak küratörlüğünü yaptı. Python 3'ü destekleyen alternatifler veya alternatifler Pek çok durumda, Python 3'te henüz mevcut olmayan kütüphaneler kilit bağımlılıklardan yoksundur ve / veya diğer projelerde Python 3 desteğinin eksikliği kullanıcı talebini azaltır (örneğin, temel Django çerçevesi, Güney ve django-kereviz gibi Python 3, ilgili araçları Python 3 desteği ve her iki Piramit içinde Python 3 desteği kullanılabilirliği eklemek için olasılığı daha yüksektir ve Django Python 3 desteği) gevent gibi diğer araçlarla hayata geçirilecek ihtimalini yapar.

Http://getpython3.com/ adresindeki site, kitaplara ve Python 3 için diğer kaynaklara bazı mükemmel bağlantılar içerir, Python 3'ü destekleyen bazı temel kütüphaneleri ve çerçeveleri tanımlar ve geliştiricilerin PSF, anahtar projeleri Python 3'e taşıyor.

Bir başka iyi kaynak, yeni bir proje için Python sürümünü seçerken göz önünde bulundurulması gereken faktörler hakkındaki topluluk wiki sayfasıdır: http://wiki.python.org/moin/Python2orPython3


3
Son 18 aydaki ilerleyişe dayanarak güncellendi (ve açıkça, 3.1’in
3.0’daki çılgın

1
Bir dereceye kadar (yani, 2.6'daki io ​​alt sisteminden önemli ölçüde daha yavaş olduğunu biliyorduk), ancak genel kullanılabilirlik üzerindeki etki beklediğimizden çok daha kötüydü (IO kriterlerimiz o zamandan beri belirgin bir şekilde düzeldi, bu nedenle böyle bir şey olma ihtimali yoktu. bugün sevk edilir)
ncoghlan

6
Önerilen zaman dilimi, 2015 yılında şu anda çok hevesli görünmüyor: |
zetah

1
Bunu görebilme biçimim (ve bunun için bir kısmına da tehlikeye gireceğim), kodlama cephesinde Py3'ün ihlal ettiği (ve hala böyle şeyler olduğu gibi) “pragmatizm saflığı yendi” noktasında Python'un Zen'i olduğunu : Py3 saf kodlama yapıyor. Py2 pragmatikti.
Jürgen A. Erhard

2
Py3 hala kodlamalar konusunda pratik değil (aksi takdirde biz vekil manzaraya sahip olmazdık), işletim sistemi arabirimlerinin Windows, .NET ve JVM gibi platformlarda nasıl çalıştığını duymak istemeyen pek çok * nix kullanıcısı ile karşılaştık. Android dahil). Bunun üzerine developerblog.redhat.com/2014/09/09/… adresinde daha fazla yazdım . Başlıca etki, mojibake üreten verilere bağlı hataları yapısal tip hatalarına dönüştürdüğümüz için, "hatalar sessizce geçilmemeli" cephesinde oldu. İkili ve metin verilerinin karıştırılması hakkında şikayetçi.
ncoghlan

48

Bir çok tereddütün iki şeyden geldiğine inanıyorum:

  • Kırılmadıysa, tamir etmeyin
  • [XYZ kütüphanesi] istediğimiz bir 3.0 bağlantı noktasına sahip değil

Bu belgede belirtilen ana dilin davranış biçiminde oldukça az fark vardır . Örneğin, "baskı" ifadesini bir fonksiyondan fonksiyona değiştirmek kadar basit olan bir şey Python 2.x kodunu bozacaktır - ve bu sadece en basit olanıdır. 3.0'da eski tarz sınıflardan tamamen kurtuldular. Aslında, oldukça farklı dillerdir - bu nedenle eski kodu taşımak, bazılarının sandığı kadar basit değildir.


2
Bağımlılığı olmayan bir bağlantı sorunu da yinelemelidir. İhtiyaç duyulan şey stdlib dışında limana bağımlılığı az olan veya hiç olmayan kütüphaneler için daha sonra zincirleme bir reaksiyon başlatabilir.
Tony Meyer

10
Siparişi değiştirirdim. Birçoğumuz etrafta dolanıyor, belirli bir paketin 3'e
taşınmasını

1
@Tony - Bu yüzden Numpy'nin şu anda hazır olduğu 3.0 için büyük bir nimet olduğunu düşünüyorum. @ S.Lott - Sanırım 3 istediğin bir şeyi teklif edip etmemeye bağlı. Dürüst olmak gerekirse, sadece çok yakın zamanda 2.5'ten 2.7'ye taşındım - bu yüzden "en son ve en iyiyi" izleyen insanlardan biri değilim.
TZHX

1
Eski kodun yardımı ile taşınması , bazılarının da korktuğu 2to3kadar zor değildir .
ncoghlan

5
Python'u dağınıklığa (OSX, Linux vb.) Bağlayan hemen hemen her işletim sisteminin Python 2'nin eski bir sürümünde hala takılı kalmasına yardımcı olmuyor. onların işletim sistemi ile iç?
Ant

28

Mevcut işletmelerde, mevcut özellik setinde hiçbir değişiklik olmazken bir şeye göç etmek için zaman, para ve çaba harcamak için zorunlu bir sebep yoktur. Demek istediğim, Python 2 serisindeki kod tabanının uzun süredir işletilmekte ve istikrarlı, test edilmiş ve mevcut tüm ürün özelliklerine sahip olduğunu söylemek istiyorum. Neden kimse Python 3'ü taşımak için sadece para harcamak için çaba harcıyor?

Göç sonrası post yanında, regresyonda başarısızlık olmadığından emin olmak ve tüm bu baş ağrısından kaçınmak mümkün değildir.

Yeni projeler için politika basit ve basittir, her şey aşağıdaki noktalarda başlar:

  1. Ubuntu gibi herhangi bir dağıtım Python 3'ü varsayılan kurulumunda gönderiyor mu?
  2. Python 3 için kütüphane ekosistemi nedir?
  3. Tüm çerçeveler ve diğerleri Python 3 ile uyumlu mu?

Her zamanki 'yeni bir dil seçme' süreci. Tavuk yumurtası sorununun ortaya çıktığı yer burasıdır, Birçok kişi kullanmıyor, çünkü pek fazla kişi kullanmıyor. Sonuçta hiç kimse hiç bir yere gitmek istemiyor.

Geriye dönük uyumluluk kırmak hiçbir zaman iyi bir şey olmadı, sonunda her zaman iyi bir kullanıcı yüzdesine son veriyorsunuz.


14

Python 2.0 piyasaya sürüldüğü zaman, Python popülerliğini hızla arttırdı. Eski sürümde hiçbir bağımlılığı bulunmadığından, en son sürümü doğal olarak kullanan birçok yeni kullanıcı vardı. Varsayılan olarak 2.0'ı kabul eden birçok insanla birlikte, kütüphane geliştiricileri vb. Üzerinde çok fazla baskı vardı.

Python 3.0 piyasaya sürüldüğünde, Python 2.0'a bağlı çok sayıda kullanıcı vardı ve üstel büyüme (mevcut kullanıcılara göre sabit bir etken tutmak) açık bir şekilde süresiz olarak sürdürülemez.

Şahsen, Python 2 gün içindeki yeni özellikler Python 3 tarafından sağlananlardan çok daha çekici görünüyordu.

Python 3'ün nihayetinde ele geçeceğini düşünürdüm, ama şu anda pek emin değilim. Ancak bu sorunu olan sadece Python değil. Sonuçta, kaç kişi dürüstçe Perl 6 kullanıyor? Bu, Python 3, IIRC'den daha uzun bir süre oldu.


3
Kahretsin, hala Fortran77'yi kullanıyorum. :) Ve Python 3'ün gerçek "özelliklerinin" çoğu uyumluluk sorunu yaşamadan 2,6 ve 2,7 olarak desteklendi. Python 3'ün gerçekten sunduğu tek şey bir "temizleyici" sözdizimidir.
TZHX

3
Python 3 ve Perl 6'yı karşılaştırmak yanlıştır. Python 3, Python 2'den artan bir sıçramadır, Perl 6 ise tamamen sıfırdan bir yeniden tasarımdır. Perl 5 ve Perl 6 kardeş dillerdir ve uzun süre birlikte yaşamaya devam ederler. Öte yandan, Python 3 Python 2'nin yerine geçmeyi planlıyor, sadece eşler değil. Bu büyük bir fark var.
kamaal

1
Perl 6 hala geliştirilme aşamasındadır. Evet, Rakudo Perl, Perl 6 spesifikasyonuna en yakın uygulamadır, ancak henüz her şeyi uygulamaz. Henüz üretime hazır bir Perl 6 uygulaması yoktur.
Htbaa

1
Bütünlük ve hazırlıklı olma birçok tanımı için @Htbaa. Perl 6 tamamlandı ve üretime hazır. Mesele şu ki, tüm özellikleri eşleştirmek biraz zaman alabilir, başka dillerle de benzer şeyler var. Örneğin GCC yakın zamana kadar bile tüm C ++ spesifikasyonlarına tam olarak uymadı. Dil tasarımı ve uygulaması çok yavaş bir süreçtir.
kamaal

1
rakudo.org/node/75 Rakudo yıldızı uzun süre önce serbest bırakıldı. Denemelisin.
kamaal

11

Otomatik çeviri ile ele alınabileceğini sanmıyorum, benim için büyük bir gösteri durdurucu, tamsayı bölümüdür. X / 2'ye dayanan x'in aşağı yuvarlanmasına (x tamsayı olduğunda) sahip bilimsel kodlarım var.

Python 3 bunu yapmazdı, ancak .5 bir cevap verirdi (tuhaf x için).
Kodumdaki / kodumun tamamını / ile değiştiremiyorum çünkü bazen float bölmesini yapıyorum ve bu yüzden float davranışını istiyorum.

Bu yüzden, python 3'e taşınmam için, onbinlerce kod satırında dolaşmam, her birini kontrol etmem ve / veya // olup olmayacağını çözüp çözemeyeceğimi görmem gerekecek.


7
"-Q" seçeneği (2.7'ye 2.2) bölümü için uyarılar artırabilir. Ayrıca, fixdiv.py bu uyarıları komut dosyalarınızdaki ifadeleri güncellemek için kullanır.
Eryk Sun

10

Python 3 yeni bir proje başlatmak için güzel eğer size gerekli olan tüm kütüphaneleri zaten Py3k nakledilir.

Bu Python 2.7 her iki dünyanın en iyisi kullanarak bir seçenek değilse: elinizdeki en Python 2.x için oluşturulan her kütüphane ve siz karar ne zaman o göç kolaydır böylece yavaş yavaş Py3k uyumlu olmak için kodunuzu değiştirebilir o. Zaten 2.7 olan Py3k sözdizimi güzelliklerinin listesi oldukça uzun, sadece almak için ihmal etmeyin __future__. Sık kullanılanlarım varsayılan olarak Unicode'dur ve bölüm her zaman bir şamandıra üretiyor.


10

Web hizmetleri açısından: Hiçbir ana sunucu çerçevesi veya web çerçevesi Python3'ü desteklememektedir.

Güncelleme: Açıkçası, bu durum 2011'in başlarında olduğu gibi, şu andan itibaren (2013'ün sonunda), çoğu büyük çerçeve Python3 ile çalışıyor. Ancak bazıları hala uyumlu değil. Önemli örnek, halen devam etmekte olan çalışma olan Twisted olacaktır .


BTW, Django, Python3'ü v 1.5'te deneysel olarak desteklemeye yeni başladı.
9000

1
Django 1.6 şimdi resmen Python 3'ü destekliyor. Flask da destekliyor.
Kasım’da chhantyal

8

Ağır i18n çalışmadığınız sürece P3K kullandığımı fark etmeme gerek yok. Besinlerimde, yaygın Unicode'un (ASCII) çalışmamın ve zorunlu üreteçlerin kodumu tıkamalarına engel teşkil ettiğini gördüm.

Birkaç yıl içinde, 3 daha zorlayıcı bir ortam sunacak, ancak bugün değil.


4

Dağılımlar Python3'ü kullanılabilir yapmaz. Python2'den geçiş yapan bazı saçak dağıtımları var. Ancak Debian, Ubuntu vb. Gibi ana Linux değişkenleri yoktur. Bu da uygulama yazarı olarak benim yapmamamın ana nedeni.

Her ne kadar geçişi hazırlasam ve uyumsuzlaştırılmış olan sözdizimi yapılarını engellemeye çalışsam da , düzgün bir şekilde test edemiyorum. Gerçekten tavuk ve yumurta problemine kaynar.


4
Bu bir zamanlar doğru olmuş olabilir, ancak "apt-get install python3" ve "yum install python3" ikisi de uzun süredir çalışıyor. Tokmak gibi araçlar ve Shining Panda CI gibi hizmetler, çoklu Python sürümlerinde denemeyi daha da zorlaştırır.
ncoghlan

Şimdi bu dağıtımların çoğu, diğer programlama dillerinin aksine, varsayılan olarak python3'ü yüklüyor.
Antti Haapala
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.