ana sayfa > istihza.com, Python > Python 3 ve Python 2

Python 3 ve Python 2

Çarşamba, 28 Tem 2010

Python 3.x serisinin ilk kararlı sürümü 3 Aralık 2008 tarihinde yayımlandı. Ancak Python 3 eski sürümlerle uyumlu olmadığı için insanlar hala Python 3′e geçmekte tereddüt ediyor. Çünkü hem etraftaki Python programları, hem Python’la ilgili kaynaklar hem de önemli üçüncü şahıs modülleri henüz Python 3′e taşınmadı. Dolayısıyla, henüz Python 3′e taşınmamış modüllere bağımlılık duyan Python programlarının yazarları 3.x’e geçiş konusunda (haklı olarak) ayak diretiyor.

Python geliştiricileri, bir yandan Python 3′ü geliştirmekle uğraşırken, bir yandan da insanların Python 3′e geçişini hızlandırmak ve korkuları gidermek için bilgilendirici ve yüreklendirici makaleler yayımlıyor. Bu yüreklendirici makalelerden biri de http://wiki.python.org/moin/Python2orPython3 adresinde bulunuyor. Bu makalede, Python kullanıcılarının sıklıkla sorduğu “Python 3′ü mü yoksa Python 2′yi mi kullanmalıyım?” sorusuna bir cevap vermeye çalışıyor Python geliştiricileri…

Bu soruyu İngilizce bilmeyenlerin de sorduğunu dikkate alarak, yukarıdaki bağlantıda verdiğim makaleyi Türkçe’ye çevirdim.

İşinize yaraması dileğiyle…

Not: Özgün makaleyi hızlı bir şekilde Türkçe’ye çevirdiğim için çeviride bazı aksaklıklar gözünüze çarpabilir. Çeviri metin üzerinde iyileştirme çalışmaları yapmaya devam edeceğim. Ayrıca özgün metin üzerinde değişiklikler olursa, bu değişiklikleri çeviri metne de yansıtacağım. O yüzden bu günlük girdisini zaman zaman ziyaret etmenizde fayda olabilir…

Fırat Özgül

************************************

Geliştirme çalışmalarım için Python 2’yi mi yoksa Python 3’ü mü kullanmalıyım?

Bu ikisinin farkı nedir?

Kısa cevap: Python 2.x dilin süregelen durumunu temsil eder. Python 3.x ise yepyeni, pırıl pırıl bir dildir.

Bu makalenin yazıldığı sırada (4 Temmuz 2010) Python’ın kararlı 2.7 sürümü yayımlanmış, serinin bu son sürümünün uzun süre destekleneceği de ifade edilmişti. 2.7’den sonra 2.x serisinde artık başka bir ana sürüm olmayacak. 3.x serisi etkin bir şekilde geliştirilmeye devam ediyor. Bu serinin 3.1 sürümü yayımlandı. 3.2 sürümü ise bu yılın sonuna doğru yayımlanacak.

3.x, Python’un en yeni dalı olup bu dilin geleceğidir. Python programlama dilinin baş geliştiricisi Guido Van Rossum, 2.x serisindeki sürümlerin aksine geriye dönük uyumluluğu gözardı ederek Python 2.x üzerinde adamakıllı bir temizlik yapmaya karar verdi. Bu yaklaşım sayesinde dilin bazı temel yönleri (mesela print ve exec’in birer deyim olması, tamsayılarda taban bölme kullanılması), bu dili yeni öğrenenler için daha kolay anlaşılır bir hale getirilebilme imkanına kavuşurken, bu yönlerin dilin geri kalanıyla da daha uyumlu olması sağlanabilecek. Böylelikle dile yakın zamanda eklenmiş özelliklerin (mesela döngü kurucular) dilde eskiden beri varolan özelliklere uyarlanması da mümkün olacak (mesela range gömülü fonksiyonunun 2.x serisinde liste döndürürken, 3.x serisinde döngü kurucu döndürmesi).

Python 3.0’daki Yenilikler adlı belgede dildeki başlıca değişiklikler ve mevcut 2.x kodlarıyla olan muhtemel uyumsuzluklar gayet güzel bir şekilde özetleniyor.

Geçen yıllar içinde geniş Python ekosistemi çok sayıda kaliteli yazılım ortaya çıkardı. 3.x serisiyle birlikte geriye dönük uyumluluğun ortadan kaldırılmasının dezavantajı, bu yazılımların 3.x serisinde çalışmaz hale gelecek olmasıdır.

O halde hangi sürümü kullanmalıyım?

Hangi sürümü kullanmanız gerektiği, çoğunlukla amacınızın ne olduğuna bağlıdır.

Yapmak istediğiniz şeyi Python 3.x ile yapabiliyorsanız ne ala! Python 3.x’te nispeten kısıtlı sayıda kütüphane desteği olması ve mevcut GNU/Linux dağıtımları ile Mac’lerin hala öntanımlı olarak 2.x sürümleriyle birlikte gelmesi gibi birkaç dezavantaj dışında Python 3.x bir dil olarak her yönüyle kullanıma hazırdır. Python 3.x’in kullanıcılarınızın bilgisayarlarında bulunduğu (bu makaleyi okuyan pek çok kişinin sadece kendi için veya denetleyebildikleri bir hedef kitle için geliştirme yaptığını düşünürsek bunu sağlamak pek de zor olmasa gerek) ve üçüncü şahıs yazılımların eksikliğinin ayak bağı olmadığı (veya ihtiyacınız olan paketlerin Python 3’ü desteklediğini bildiğiniz) durumlarda Python 3.x kusursuz bir seçimdir. Ayrıca şu anda öntanımlı sürüm olarak kullanmasalar da pek çok GNU/Linux dağıtımı son kullanıcılar için Python 3.x paketleri sunabilmektedir.

Ancak yine de Python 3 yerine Python 2 kullanmanızı gerektiren bazı ciddi meselelerle karşılaşabilirsiniz.

Birincisi, eğer programınız denetiminiz dışındaki bir ortamda çalışacaksa, kullanacağınız Python sürümünü seçme özgürlüğünüz olmayabilir. Böyle bir durumda belli bir Python sürümü kullanmak durumunda kalabilirsiniz.

İkincisi, eğer henüz Python 3 ile uyumlu bir sürümü yayımlanmamış belli bir üçüncü şahıs paketi ya da uygulaması kullanmak istiyorsanız, üstelik bu paketi Python 3.x sürümüne taşımak hiç de kolay bir iş değilse, o paketten yararlanabilmek için Python 2’yi kullanmayı tercih edebilirsiniz.

Python 3’ü desteklemeyen önemli uygulamalar arasında Twisted (ağ programlama ve başka pek çok şey için kullanılan bir kütüphane), gevent (Twisted’a benzeyen, ama farklı özellikleri olan bir kütüphane), Django ve Pylons (web siteleri hazırlamaya yardımcı uygulamalar), PyGTK ve PySide (grafik arayüz tasarımı), py2exe (programlarınızı Windows için paketlemeye yarayan bir kütüphane), PIL (resim işleme) ve numpy (sayı işlemleri) sayılabilir…

Bu kütüphanelerin çoğu için Python 3.x uyumluluğu üzerinde, farklı aşamalara gelmiş birtakım çalışmalar yürütülüyor. Örneğin numpy üzerindeki çalışmalar tamamlanmak üzere. Bazı kütüphanelerde ise durum bir öncelik meselesinden ibaret. Mesela Twisted çoğunlukla üretim boyutundaki sunucuları hedeflediği için, dilde büyük değişiklikler getiren bir sürüme destek vermek şöyle dursun, Python’un eski sürümlerini desteklemek dahi büyük önem taşıyor. (Twisted, 3.x’e taşıma işleminin hiç de kolay olmadığı paketler denince akla gelen başlıca örnektir.)

Elbette 3.x’e taşınmış pek çok paket de var. Örneğin yazdıkları programlara grafik arayüz eklemek isteyenler PyGTK yerine PyQT veya standart kütüphane içinde gelen Tkinter’i kullanabilir. Python 3.x kullanmak istiyor, ama bir bağımlılıktan ötürü bundan çekiniyorsanız öncelikle biraz araştırma yapmak iyi bir fikir olabilir. Kütüphaneleri taşıma işlemi devam eden bir süreçtir. Ayrıca bu wiki sayfası da zaman zaman güncellenebilir.

Python 3’e geçişle ilgili başka bir sorun da referans kitaplar ve internet üzerindeki pek çok belgenin (örnek kodlar da dahil) hep Python 2.x üzerine olmasıdır. Bu sebeple Python 3 kullanabilmek için kaynaklarda bazı düzenlemeler yapmak gerekebilir. Aynı şekilde IRC üzerinden yardım almaya alışmış kişiler için konuşmak gerekirse, #python kanalının müdavimleri, henüz 3.x’e taşınmamış, eskiden beri kullanılan yazılımlara bel bağlayan güngörmüş geliştiricilerdir (Burada örnek olarak akla Twisted, Zope ve daha önce bahsettiğimiz paketler geliyor). Sonuç olarak, IRC üzerindeki geliştiriciler size Python 3.x ile ilgili veya Python 3.x’e taşınmış kütüphaneler ile ilgili sorunlar konusunda, Python 2.x konularında yardımcı olabildikleri kadar yardımcı olamayabilir. Aynı şey #python kanalı dışındaki ortamlar için de geçerlidir. Elbette bu durum yavaş yavaş düzeliyor. Ayrıca bazı problemler zannettiğiniz kadar 3.x’e özgü olmayabilir. Dolayısıyla #python kanalından veya alternatif kaynaklardan yardım istemek yine de iyi bir fikir olabilir. Her şeye rağmen, comp.lang.python gibi, 3.x kullanıcılarının bolca bulunduğu ve sorunlarınız için yardım alabileceğiniz önemli kanallar da mevcuttur.

Ama 2.x sürümünü bir kenara bırakmak en iyisi değil mi? Ne de olsa bu, pek çok hata barındıran eski bir dil. Üstelik bütün bu hatalar ortadan kalksın diye koca bir sürüm yayımlandı.

Aslında pek de öyle değil. İyi haber şu ki, sırf 2.x kullanıyorsunuz diye 3.x’in bütün nimetlerinden mahrum kalacaksınız diye bir kaide yok. 3.0 ile uygulamaya giren pek çok yenilik 2.6’ya da aktarıldı. Üstelik 3.0, 3.1 ve yakında yayımlanacak olan 3.2 ile gelen daha pek çok yenilik de 2.7 sürümüne aktarılacak. 2.x’te yapamayıp da 3.x’te yapabileceğiniz şeyler çok azdır. Ama 2.x ile yapabilecekleriniz, 3.x ile yapabilecekleriniz kadar şık ve zarif değildir. Yalnızca 3.x sürümlerinde bulunan ve muhtemelen 2.x serisine taşınmayacak olan bazı özellikler şöyle sınıflandırılabilir:

  1. Açıklamalı Fonksiyon Parametreleri (function annotations)
  2. Sadece isimli argümanlardan oluşan fonksiyonlara ait sözdizimi
  3. Genişletilmiş demet çözme
  4. Yerel olmayan değişken tanımlama

2.x’e taşınan özelliklere ilişkin ayrıntılı bilgi için bkz. Python 2.6’daki Yenilikler ve Python 2.7’deki Yenilikler

İyi yazılmış bir 2.x kodu 3.x koduna benzer. Ancak bunu sağlamak için bazı şeylere de dikkat etmeniz gerekecektir. Mesela yeni tipte sınıfları kullanmak, print’in eski ve küflenmiş kullanımlarından uzak durmak, mümkün olduğunca liste/demet/sözlük üreteçlerinden yararlanmak gibi… Buna şöyle bir örnek verebiliriz: İyi bir 2.x kodunda range yerine xrange kullanılır. xrange 3.x’teki range’e çok benzer (Tabii Python 3’teki range çok daha yeteneklidir, çünkü sys.maxint’in gösterdiği değerden çok daha fazlasını kullanabilir).

Her şeyden öte, 2.x’ten 3.x’e geçişin olabildiğince sancısız olabilmesi için iyi kod yazmaya odaklanmanızı öneriyoruz. Bununla, eksiksiz birim testleri yazmayı ve Unicode’u düzgün kullanabilmeyi kastediyoruz (Python 3.x, Unicode ve baytlar konusunda 2.x’e kıyasla daha tavizsizdir. Bu tavizsizlik iyi bir şey olarak kabul edilir, ama bu durum bazı yazılımların 3.x’e aktarılmasını da epey zorlaştırabilir).

Python 3’ü kullanmak istiyorum, ama elimde sadece Python 2.x ile çalışabilen küçük bir kütüphane var. Acaba Python 2 ile devam mı etmeliyim, yoksa o kütüphaneyi kullanmaktan vaz mı geçmeliyim?

Halihazırda Python 3’ü destekleyen alternatif bir paket bulamadığınızı varsayarsak, yine de önünüzde birkaç seçenek var:

  1. O kütüphaneyi 3.x’e taşıyabilirsiniz (“Taşımak”, o kütüphaneyi 3.x üzerinde çalışabilir hale getirmek demektir.)
  2. Eğer taşıma işlemi çok zor olacaksa ve programınızın öteki bütün bağımlılıkları 2.x ile çalışıyorsa siz de 2.x üzerinde çalışmaya devam edebilirsiniz. Başka yerlerde de ifade edildiği gibi, bütün bağımlılıklar başarıyla 3.x’e taşındıktan sonra, iyi yazılmış bir 2.x kodunu 3.x’e taşımak sancısız bir süreç olacaktır.
  3. O kütüphanenin kattığı özelliğin ne kadar önemli olduğunu kafanızda tartın. Kimbilir belki o kütüphaneyi programınızdan çıkarsanız da olur.

Arzu edilen, o kütüphaneyi 3.x’e taşımaktır. Genellikle birileri zaten bu iş üzerinde çalışıyordur. Değilse, kütüphanenin geliştiricileri bu konuda yardım teklifinizi çoğunlukla geri çevirmeyecektir. Çünkü taşıma işlemi hem özgün yazılım içindeki hataların bulunmasını sağlar, hem de özgün yazılımın ve 3.x’e taşınmış halinin kalitesini yükseltir. Taşıma işlemi her zaman o kadar kolay değildir. Ancak taşımak sıfırdan yazmaktan kolaydır.

Taşıma işleminin nasıl yapılacağı PEP 3000‘de açıklanmıştır. Ana fikir, söz konusu kütphanenin 2.x sürümünü alıp, Python 3’le uyumlu bir sürüm elde etmek için 2to3 adlı dönüşüm betiğini kullanmak ve bütün birim testlerinin 3.x sürümünde de geçer olup olmadığını kontrol etmektir. Eğer testler geçersizse özgün 2.x kaynağını düzenleyip aynı işlemi tekrar edin. Bu yaklaşım sayesinde tek bir 2.x kod tabanı üzerinden hem 2.x’i hem de 3.x’i kolayca destekleyebilirsiniz. Bu, 2.x ve 3.x dallarını ayrı ayrı desteklemekten çok daha kolaydır (Bunu bir de Python geliştiricilerine sorun. Ne de olsa onlar bu işi yıllardır yapıyor!).

Eğer kütüphane içinde C eklenti modülleri de varsa taşıma işlemi karmaşık bir hal alabilir, ancak böyle bir durumda bile muhtemelen taşıma işlemi kendi paketinizi sıfırdan yazmaktan kolay olacaktır.

Python vikisinde bu konuya ilişkin daha ayrıntılı kılavuzlar bulabilirsiniz: Python’u Py3k’ya Taşımak, Eklenti Modüllerini Py3k’ya Taşımak

3.x ile bir şeyler yazmaya karar verdim, ama şimdi bu yazdığım şeyi elinde sadece 2.x bulunan biri kullanmak istiyor. Ne yapmalıyım?

2.x kaynak kodlarından 3.x kodları üretilmesine olanak tanıyan 2to3 adlı aracın yanısıra, 3.x kodlarını 2.x koduna dönüştürmeyi amaçlayan 3to2 adlı bir betik de vardır. Teorik olarak, 3.x’te daha az pürüzlü nokta olduğu için (ne de olsa geriye dönük uyumluluğu kırmanın ana sebeplerinden biri de bu pürüzlü noktaları olabildiğince gidermekti!) 3to2 aracı daha iyi sonuç verecektir. Ancak 3.x’e özgü özellikleri (mesela açıklamalı fonksiyon parametreleri veya genişletilmiş demet çözme) bolca kullanan kodların başarıyla 2.x’e dönüştürülmesinin de pek mümkün olmayacağı bilinmelidir.

Ayrıca şu anda 3to2 aracının, 2to3 aracına kıyasla daha az kullanıldığını söyleyebiliriz. Dolayısıyla 3to2 aracında bazı aksaklıklarla karşılaşabilirsiniz. Ancak eğer 3.x kodları yazmak istiyorsanız elbette bu araç denemeye değer…

Python 2 ile Python 3 arasında seçim yapmanıza yardımcı olabilecek başka kaynaklar

#python tayfasından öğütler (aynı zamanda bu makalenin de ilham kaynağıdır): http://python-commandments.org/python3.html

Özellikle Python 3 üzerinden programlama öğretimi konusunda Nick Efford’un bazı önerileri var: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html

Mark Pilgrim Dive Into Python’ın Python 3’ü temel alan sürümünü yayımladı: http://diveintopython3.org/whats-new.html

“IronPython kullanıcılarının Python 3 hakkında bilmesi gerekenler”: http://www.itworld.com/development/104506/python-3-and-ironpython

istihza.com, Python , , , ,

  1. yunusemrecan
    Cuma, 22 Nis 2011 zamanında 15:14 | #1

    python ile yazdığım dpsyaları .py uzantısından nasıl derleyip exe yapabilirim

  2. yunusemrecan
    Cuma, 22 Nis 2011 zamanında 15:16 | #2

    ve python ile androiad programa yapabilir miyim hangi python sürümü daha uygun olur bu konuda geniş bir yazı yazabilir misin?

  3. Cuma, 22 Nis 2011 zamanında 15:53 | #3

    Android tabanlı telefonum yok. O yüzden bu konuda hiçbir bilgim de yok.

  4. Cuma, 22 Nis 2011 zamanında 15:54 | #4

    Eğer Python2 kullanıyorsanız, Py2exe’yi kullanarak programlarınızı .exe haline getirebilirsiniz. Eğer Python3 kullanıyorsanız cxFreeze diye bir program var.

  5. emre
    Salı, 14 Haz 2011 zamanında 15:35 | #5

    python hack ve anti hack için uygun mu?
    Uygunsa hangi sürümü daha iyi?

  1. şimdilik geri bağlantı yok