makaleler / Python Programlama / Kendi Gelişimim İçin Python 2'yi mi Yoksa Python 3'mü Kullanmalıyım?

Kendi Gelişimim İçin Python 2'yi mi Yoksa Python 3'mü Kullanmalıyım?

16.03.2014 23:05:43

Bu yazı size Python 2 yada Python 3 kararını vermenize yardımcı olacak.

Aralarındaki Farklar Nelerdir?

Kısa bir deyimle: Python 2.x efsane bir dildir, Python 3.x ise şimdinin ve geleceğin dilidir.


En son 2.x versiyonu olan 2.7, ömür boyu destek olarak nitelendirilen geliştirilmiş ve genişletilmiş destek birimiyle 2010 yılının ortalarında piyasa çıktı. 2.x kullanıcıları, 3.x versiyonun aktif gelişim altında geliştirilmesine ve 4 yıldan beri stabil sürümlerinin piyasaya sürülmesinee rağmen çok da fazla büyük bir değişiklik yapılmadığını göreceklerdir. Piyasaya çıkacak olan bir sonraki sürüm ise 2014 yılında bizlerle buluşacak olan Python 3.4 olacak. Bu da, örneğin Python 3.x sürümlerinde standart olarak sunulan son olarak gerçekleştirilen tüm kütüphane geliştirmelerini içeren bür sürüm olacağı anlamına geliyor.


Python dilinin yaratıcısı Guido van Rossum, yavaş yavaş uyumluluk sistemini değiştirerek Python 2.x’i piyasadan kaldırmaya karara verdi. Rossum, bu dili kaldırırken ufak tefek yeni sürümlerini de piyasa süreceğini belirtti. Bu sürümlerde olan en ilgi çekici yenilik ise daha iyi durumda olan Unicode desteği ve bit/Unicode ayrım sistemi oluyor.
Tüm bunların yanında, bu hücre dili, yeni başlayanlar ve dile daha fazla hakim olmak isteyenler için oldukça kolay olacak şekilde tasarlanmış. Ayrıca dil içerisindeki işe yaramayan bileşenler kaldırılmış. (örneğin yeni versiyondaki “range ()” 2.x’deki listelere değil, yenilenebilir hafızaya dönüyor.)

Python 3.0’daki Yenilikler Nelerdir? Adlı döküman, bu gelişmiş dili genel olarak ele alıyor ve mevcut Python 2.x kodlarıyla uyumsuzlukları ve yapılan değişiklikleri bizlere sunuyor. Ayrıca Nick Coghlan, Cpython geliştiricilerinden biri, bu değişiklik hakında “Sıkça Sorulan Sorular” adlı bir döküman oluşturmuş.

Fakat bu geniş Python ekosistemi, yıllar geçtikçe çok büyük bir birikinti haline geldi. 3.x sürümüyle uyumluluk konusunda eksik olan nokta ise özellikle ev-içi yazılımların henüz 3.x sürümüyle uyumlu bir şekilde çalışmadığıdır.


Hangi Versiyonu Kullanmalıyım?
Hangi versiyonu kullanacağınız, ne yapmak istediğinizle doğru orantılıdır.

Eğer Python 3.x diliyle ne yapmak istediğinizi gerçekten biliyorsanız bu harika! Bu sürümde biraz eksik kalmış kütüphane desteği ve şu anki Linux ve Mac işletim sistemlerinin standart olarak 2.x sürümünü kullanması gibi eksik yönler bulunuyor. Fakat bir dil olarak bakıldığında, Python 3.x gerçekten her türlü kullanıma hazır gibi görünüyor. Kişisel bilgisayarınızda Python 3.x yüklü olduğu sürece (bazı insanlar bunu sadece kendileri ya da kontrol ettikleri çevrelerindeki bazı şeyleri geliştiren bir dil olarak gördükleri için bu oldukça kolay olabilir) ve Python 2.x’in gerekli olmadığını düşündüğünüz konularda birşeyler programlıyorsanız, bu mükemmel bir seçim olacaktır. Ayrıca şuan bir çok linux dağıtımı Python 3.x yüklü olarak piyasaya çıkmaktadır. Bu sürümlerin bazıları ise Python 2 yüklü sürümlerini ayrı olarak kullanıcılara sunmaktadır.

Özellikle bu dilin eğitimini veren bireyler, yeni programcı öğrencilerine ilk olarak Python 3 dilini öğretip, daha sonra ise (eğer gerekliyse) Python 2 ve öncesindeki sürümlerle bu yeni sürümün arasındaki farkları öğretmektedirler. Bunun sebebi ise az önce de belirttiğimiz gibi, Python 3, Python 2 sürümlerinde olan bir çok gereksiz bileşeni ortadan kaldırmasıdır.

Fakat, aşağıda Python 3’den ziyade Python 2’yi kullanmanızı gerektiren durumlardan bazıları listelenmiştir.

  • Eğer kontrol etmediğiniz bir çevre geliştiriyorsanız, daha özel bir versiyon kullanmanız gerekebilir.
  • İkinci olarak, Python 3 ile uyumlu olmayan özel bir üçüncü taraf yazılımı kullanıyorsanız ya da çözülmesi zor olan bir paket çıkarmanız gerekiyorsanız, bu paketlere ve yazılımlara erişmek için Python 2’yi kullanmanız gerekebilir.

Ayrıca Twisted (ağ sistemi ve diğer uygulamalar içindir), gevent (Twisted benzeri bir ağ kütüphanesidir fakat mikro-konuları kullanır.) gibi büyük ün kazanmış modüller, henüz Python 3 ile uyumlu olarak çalışamamaktadır.
Yukarıda belirttiğimiz kütüphanelere benzer bir çok kütüphane, 3.x destek üzerine ve geliştirme üzerine çalışan çok fazla sayıda kullanıcıya sahip. Bazı kütüphaneler için, bu durum diğerlerinden daha fazla önceliğe sahiptir. Örneğin Twisted önceki Python versiyonlarını desteklemenin önemli olduğu sunucuların üretimine odaklıdır ve dilde büyük değişikliklere yol açan yeni versiyonları desteklemeye pek karışmaz. (Twisted bu konudaki en büyük örneklerden biridir.)

Kullanıcı arabirimi uygulamaları için Python 3 Tkinter ile donatılmıştır ve Python 3’ün piyasaya çıktığı tarihten bu yana PyQt’yi desteklemektedir. PySide ise Python 3’e 2011 yılında eklenmiştir. GTK+ Kullanıcı arayüzleri (GUI), Python 3 ve PyGtk’yi destekleyen PyGObject ile oluşturulabilir.


Python 3’te kullanılan paketler aşağıda listelenmiştir;
  • Numpy (yoğun hesaplar için)
  • Django, Flask, CherryPy ve Pyramid (İnternet siteleri için)
  • PIL (Resim işlem modülü)’nün yerini Python 3’ü destekleyen Pillow almıştır.
  • Cx_Freeze (paket sınırlılıklarını göz önünde bulunduran paketleme uygulaması)
  • Py2exe (Windows kullanıcıları için yazdığınız uygulamaları paketlemeye yarayan uygulama)

Python 3.x kullanmak istiyor fakat destek konusunda bazı kaygılarınız var ise, öncelikle yapmanız gereken şey bir takım araştırma yapmaktır. Bu hala devam eden bir süreçtir ve içinde bulunduğunuz wiki sayfası eski tarihli olabilir. Daha da fazlası, en yaygın alt kümelerin Python 2.6+ ve Python 3.3+ tarafından desteklenmesiyle, özellikle arayüzü ve internet uygulamaları gibi veriyi ve yazıyı kusursuz şekilde harmanlaması gereken uygulamaların kodları gibi Python kodları, Python 3 üzerinde değiştirilmeden kullanılabilir durumda olmalıdır.

Resmi python yardımcı belgelerinin ve derslerinin Python 3 için güncellenmiş olmasına rağmen, internette Python 2’i kullanan belgeler ve referanslar bulunmaktadır. Ayrıca bu belgeler oldukça günceldir. Bunun yerine artık Python 3 için yararlı olan birşeyleri yapmak gerekebilir.

Bazı insanlar Python 3.x sürümlerini kullanmak istememektedirler. Bu onların seçeneği tabi ki. Fakat belirtmekte yarar var, bu insanların sayısı oldukça az.

IronPython, Jython ya da PyPy gibi Python’a alternatif diller kullanmanız size bir yarar sağlamayacaktır, çünkü bu dillerin de Python 3 desteği oldukça azdır. Az önce bahsettiğimiz şey, eğer performans amaçlı bu tarz dilleri diğer sistemlere entegre etmek isteyenlerdenseniz, sizi etkileyebilir.

Fakat yine de 2.x versiyonlarını kullanmaktan kaçınmam gerekmez mi? Bu eski bir versiyondur ve bir çok hata ve gereksiz bileşene sahip ve ayrıca yeni gelen sürüm bu olumsuzlukların hepsini ortadan kaldırdı.

Evet kısmen doğru. 3.0 ve 3.1 versiyonlarında bulunan bazı değişiklikler, 2.6 ve 2.7 versiyonlarına eklendi. Geçmiş versiyonlara eklenen yeni değişiklikler hakkında daha fazla bilgi için, Python 2.6’daki Yenilikler Nelerdir? Ve Python 2.7’deki Yenilikler Nelerdir? Adlı makalelere göz atınız.


Aşağıda sadece 3.x de bulunan ve 2.x versiyonlarında bulunmayan özellikler listelenmiştir;
  • Dizgeler standart olarak Unicode’dur
  • Unicode/bit ayrımı temizlenmiştir.
  • Kural dışı işlem zincirlemeleri
  • Fonksiyon ek açıklamaları
  • Anahtar kelime parametleri için sözdizimi
  • Genişletilimiş veri grupları paketi açılımı
  • Bölgesel olmayan değişken tebligatlar

Ayrıca dilde yapılan değişiklikler hücrelerin söz dizimi ya da anlamlarında yapılan değişikliklerle sınırlı değildir. Bu değişiklikler ayrıca direk olarak Python 2 versiyonlarına geri yükleme yapılmayacak olan 3.x versiyonlarındaki bir çok değişikliğin bulunduğu standart kütüphaneyi de kapsamaktadır. Fakat standart kütüphane için yapılan bir çok geliştirme aynı zamanda PyPI için de mevcuttur.

İyi yazılmş betik 2.x kodu, 3.x kodu gibi görünebilir. Bu bir çok anlama gelebilir; yeni stil sınıfları kullanma, eski yazdırma için gizli söz dizimlerini kullanmama, yeri geldiğinde ilginç yineleyicileri kullanma gibi. Pratikten bir örnek vermek gerekirse, iyi derlenmiş bir 2.x kodu, tipik olarak range yerine xrange’yi kullanır; xrange, Phyton 3.x için dizi başlangıcını ifade eder. (Dizinlerin Pyhton 3’de daha iyi olmasına rağmen, bu dizinler daha büyük değerlere ev sahipliği yapabilirler). Ayrıca belirtmeliyiz ki, xrange (), Python 3’de çalışmamaktadır.

Yukarıda da belirttiğimiz gibi, 2.x ya da 3.x gibi versiyonları kullanmanızın çok fazla bir önemi yoktur. Önemli olan iyi kodlama yapmaktadır. Bu iyi kodlama, eksiksiz bir test grubu yazma ve Unicode’yi çok iyi anlamaktan geçer. (Python 3.x, Unicode vs Bit konusunda 2.x den daha acımasızdır: Bu iyi bir şey gibi düşünülebilir fakat bazı zaman oldukça sinir bozucu olabilmektedir)

Pyhton 3 kullanmak isiyorum fakat kullanmak istediğim kütüphane sadece Python 2.x uyumlu. Phython 2 mi kullanmalıyım yoksa kullandığım kütüphaneyi mi değiştirmeliyim?


Hali hazırda Pyhton 3’ü destekleyen alternatif paket bulamadığınızı düşünürsek, göz önüne almanız gereken bir kaç seçenek aşağıda listelenmiştir.
  • Kullandığınız kütüphaneyi 3.x versiyonuyla uyumlu hale getirin.
  • Eğer bu işlem oldukça zor bir işlem olursa ve tüm destek dosyalarınız 2.x versiyonundaysa, 2.x kullanmayı düşünmeye başlayabilirsiniz. Yukarıda da açıkladığımız gibi, iyi yazılmış bir 2.x kodu, diğer tüm yeni versiyonlardan daha fazla başarılı olabilir.
  • Üzerine kafa yorduğunuz özelliğin gerçekten sizin için önemli olup olmadığına karar verin. Belki bu özelliği bir kenara atıp bir diğer versiyona geçebilirsiniz.

Yukarıda saydıklarımızın arasından en makul ve en ideal olanı mevcut kütüphanenizi 3.x versiyonu ile uyumlu hale getirmektir. Nadiren, bu işlem üzerinde çalışan insanlarla karşılaşabilirsiniz. Asıl odaklanılması gereken konu olmamasına karşın, proje üzerinde çalışan insanlar, hata bulma, kalite artırma gibi konularda yardım almaktan her zaman mutluluk duyarlar. Dönüştürme her zaman kolay bir iş değildir fakat oturup kendi başınıza sıfırdan yazmaktan çok daha kolay bir işlemdir.

Bu dönüştürme işlemini nasıl yapacağınız, Python 2 Dönüştürme Rehberi adlı makalede yazmaktadır. Bu makalede anlatılmak istenen temel şey, 2.x versiyonuyla uyumlu bir kütüphaneyi almak ve deney gruplarının Pyton 2’ye dönüşümü için -3 komut dizini kullanımı sırasında uyarı vermediğinden emin olmaktır. Eğer bu test sırasında bir uyarı ile karşılaşırsanız, gerekli kaynakları değiştirerek tekrar deneyin (bu işlem daha eski Python sürümleriyle uyumsuzluk sornlarına yol açabilmektedir). -3 kod satırını kullandığınızda herhangi bir uyarıyla karşılaşmadığınız zaman, bu kütüphaneyi Python 3’de çalıştırmayı deneyin. Olabilecek en iyi durum, Python 2 de oldukça iyi çalışan – kodu Python 3 ile uyumlu olarak sadece çalışır vaziyette olduğu zaman, dönüştürme işlemi bu adımda mümkün kılınır.

Eğer yapılan denemeler, Python 3’de hata vermeye devam ederse, standart kütüphaneni 2to3 uygulaması, Python 3’de çalışacak bir versiyonu otomatik olarak oluşturacaktır. Buna alternatif olarak, Armin Ronacher’in pyhton-modernize uygulaması 2.6+ sürümlerine yönelik olmak yerine hem 3.2+ hem de 3.3+ sürümlerine yönelik olarak çalışmaktadır (bu durum kullanılan komut satırı seçeneklerine göre değişebilir). (Eğer son sürümü kullanıyorsanız, komut dizininin Python 2’de çalışıp çalışmadığını kontrol etmek oldukça önemlidir.)

Her iki yaklaşım da, tek bir 2.x kod tabanından 2.x ve 3.x versiyonlarını desteklemeyi mümkün kılabilmektedir. Ayrıca bu yöntem, 2.x sürümlerini ve 3.x sürümlerini ayrı ayrı kontrol etmekten çok daha kolaydır.

Eğer yaptığınız testler, otomatik dönüştürme ya da modernize etme işlemlerinden sonra hala hata veriyorsa, kullandığınız kod Python 2 ve 3 arasındaki söz dizimi değişikliğinden etkilenmiş, otomatik olarak başlatılamıyor ve -3 anahtarı tarafından tespit edilemiyordur. Bu gibi durumlar çok nadir meydana gelmektedir fakat eğer bu hatayla karşılaşırsanız, Cpython’un yeni -3 uyarılarına karşı bu hatayı gidermek önemlidir.

Dönüştürme işlemi C genişletme modülleri entegre edildiği zaman ve yapılan proje Cython, cffi ya da SWIG gibi Pyhton 2 ve 3 arasındaki değişiklikleri saptayan oluşturucuları kullanmadığı zaman genellikle daha zor bir hal alır. Geniş Dönüştürme Rehberi adlı döküman, bazı önemli noktalardan bahsetmektedir.

Ayrıca wiki üzerinde bu konuyu daha derin ele almış dökümanlar mevcuttur: PortingPythonToPy3k, PortingExtensionModulesToPy3k.


3.x versiyonları üzerinde birşeyler yazmaya karar verdim fakat sadece 2.x versiyonuna sahip kişiler bunu kullanmak istedi? Ne yapmalıyım?

2.x kaynak kodunun 3.x kodlarında çalışmasını sağlayan 2to3 aracına ek olarak ayrıca 3.x kaynak kodlarını 2.x versiyonlarında çalışacak şekilde uyumlu hale getiren 3to2 aracı bulunmaktadır. Teorik olarak, geriye doğru dönüştürme işlemi, ileriye doğru olandan daha iyi sonuçlar verir. 3.x sürümündeki kodlar, gereksiz bileşenlere sahip olmadığı için geriye dönüştürme daha kolay olacaktır. Fakat sadece 3.x deki özelliklerin çalışmasını sağlayan kodlar, başarılı şekilde geriye dönüştürme işlemine tabi tutulamazlar.

Aslını söylemek gerekirse, 3to2 aracı, 2to3 aracının dönüştürme için kat ettiği yoldan daha az bir yol katederek işlemi gerçekleştirmektedir. Bu yüzden işlem sırasında daha az sayıda hatayla karşılaşmanız muhtemeldir. Eğer 3.x kodu yazmak istiyorsanız, bu fikir keşfetmeye değer.


Aynı Kod Tabanından Python 2 ve Python 3’ü Desteklemek

Python 2.6+ ve Python 3.3+’ın genel kod alt grupları oldukça büyüktür – Python 3.3+’de bulunan Unicode için u ön eki restorasyonu, anlamsal olarak doğru derlenmiş Python 2.6+ kodlarının, Python 3.3+ ile uyumlu şekilde çalışacağı anlamına gelmektedir. Aralarındaki farklılık ise kodların isimleri Python 2’de ve 3’de farklı olduğu için bazı kodlar ve bileşenlerin farklı noktalardan bir diğerine aktarılması gerekebilmesidir.

Buna göre, altı uyumluluk paketi, Python 2 ve Python 3’u aynı kod tabanından desteklemek için yazılan önemli paketlerden biridir.

Gelecek uyumluluk paketi hala deneme aşamasındadır ve Python’un bir çok versiyonunu altı uyumluluk paketi kadar desteklememektedir fakat Pyhton 2’nin Python 3 benzeri bir yapıda yazılmasına izin verir (örneğin bu paket, Python 2.x’in 8bitlik dizgi tipinden ziyade, Python 2 uyumlu Python 3 bit tiplerini içerir.
Standart kütüphane modüllerini tanımlamak için bir diğer ana faktör de 2.x’in kütüphanesine alternatif olarak kullanılabilen PyPI üzerinde güncel geri dönüştürme olup olmadığını saptamaktır.

Aşağıdaki modüller, hem PyPI geri dönüştürmeleri hem de Python 2.7 ya da 3.x’de kullanılan kütüphanenin kaynakları olarak hizmet eden modüllerdir.

  • Unittest2 (Michael Foord, stdlib deneme grupları bakımcısı, genel olarak 2.6 desteği gerektiri)
  • Mock (Michael Foord, stdlib deneme grupları bakımcısı)
  • Contextlib2 (Nick Coghlan, stdlib contextlib bakımcısı)
  • Configparser (Lukasz Langa, stdlib configparser bakımcısı)
  • Futures (Alex Grönholm ve Brian Quinlan, stdlib eşzamanlı.futures bakımcısı)
  • Argparse (Steven Bethard, stdlip argparse bakımcısı, genellikle 2.6 desteği gerektirir)
  • Faulthandler (Victor Stinner, stdlip faulthander bakımcısı)
  • Cdecimal (Stefa Krah, stdlip decimal bakımcısı)
  • İpaddr (Peter Moody, stdlip ipadress bakımcısı, Google’ın IP adres manipülasyon modülü, stdlip ipadress modülünden etkilenilerek geliştirilmiştir.
  • Stats (Steven D’Aprano, stdlip istatistik bakımcısı)
  • Enum34 (Etham Furman, stlib enum bakımcısı)
  • Funcsigs (Aaron Iles, İmza Objelerinin Fonksiyonlarının Geri Dönüşümü)
  • Shared namespace module for backports (Brandon Craig Rhodes)
  • Backports.inspect (Tripp Lilley, ek geri dönüşüm modül değişikliği edenetleyicisi, funcsigs tabanlı)
  • Backports.datetime_timestamp (Jason R. Coombs, datetime.timestamp metodunun tarih kabul eden fonksiyon seviyelerini belirleyen modülün geri dönüştürülmesi)
  • Backports.pbkdf2 (Christian Heimes, stdlib hashlib bakımcısı, hashlib.pbdkf2_hmac’ın geri dönüştürülmesi)
  • Backports.ssl_match_hostname (Brandom Craig Rhodes ve Toshio Kuratomi, ssl.match_hostname’nin geri dönüştürülmesi)
  • Backports.Izma (Peter Cock, Izna örtü modülünün geri dönüştürülmesi)
  • Izmaffi (Tomer Chachamu, daha iyi PyPy JIT uyumluluğu için cffi kullanan Izma geri dönüştürme düzenleyicisi)
  • Tracemalloc (Victor Stinner, stdlib tracemalloc bakımcısı
  • Pathlib (Antoine Pitrou, stdlib pathlib bakımcısı)

Geri dönüştürme isim modülünü kullanmanın avantajı, bu modülün standart kütüphanenin geri dönüştürülmesinde karşılaşılan zıt versiyonları açıkça belli etmesi ve orjinal modül isminin, standart kütüphane isimleriyle çakışmadan kullanılabilesini sağlamasıdır.

Bazı ufak tefek Python 3 eklentileri, ActiveState Python Tarif Kitabı’nda yer almaktadır.
Functools.lru_cache (Raymond Hettinger)

Aşağıdaki modüller geri dönüşüm modülleri değildir. Fakat bunlar standart kütüphane API’leri için karşılık gelen uyumlu versiyonlardır.

  • Requests (Yüksek level HTTP ve HTTPS Uygulamaları. Bu uygulamalar kendilerini diğer uygulamalardan farklı olarak teknik sebeplerden dolayı stdlib’e eklerler. Fakat bu uygulamalar olası gelecek eklentileri için zaman uyumsuzluğunu ba alan API ile eşittir)
  • Regex https://pypi.python.org/pypi/regex [pypi.python.org] (alternatif stdlib entegre motorudur fakat birleşme detayları üzerine çalışmak için PEP gerektirir)
  • Lxml.etree (ElementTree XML API’nın alternatif bir entegrasyonudur.)
  • Ayrıca Python 2’yi de destekleyen ve yukarıda belirtilen modüllere ek olarak, zaman uyumsuzluğu modülü Python 3.3 modülü için tasarlanan PyPl modülü tarafından geliştirilen Python 3.4’teki standart kütüphaneye eklendi.
  • Asyncio (Guido van Rossum, BDFL ve stdlib asyncio bakımcısı, Python 3.3’ eklenen “yield from” dizgisi gerektirir) https://pypi.python.org/pypi/asyncio [pypi.python.org]


Python 2 ile Python 3 arasında seçim yapmanızı kolaylaştıracak diğer kaynaklar

Dipnotlar
En uzun desteğe sahip paketler https://python3wos.appspot.com/ [python3wos.appspot.com]
Arch Linux, python’u python3’e bağlıyor ve ubuntu ve Fedora anahtar tabanları bu adreste.. https://wiki.ubuntu.com/Python/3 [wiki.ubuntu.com] https://fedoraproject.org/wiki/Changes/Python_3_as_Default [fedoraproject.org]

Bu makalenin ingilizce versiyonu. https://wiki.python.org/moin/Python2orPython3 [wiki.python.org]
yazar husonet

Yorumlar

Bu içerik için sizde yorum yapabilirsiniz!
anasayfa | makaleler | haberler | dosyalar | linkler | hakkımızda