arşiv

yazılar buna göre etiketlendi; ‘python 3.x’

istihza.com: Python 2 ya da Python 3

Perşembe, 29 Tem 2010

Bildiğiniz gibi, Python’un en yaygın kullanılan sürümleri 2.x serisinden… Henüz Python 3.x serisi yeterli yaygınlığa ulaşamadı. Bunun sebeplerini daha önceki günlük girdilerinde tartışmıştık. Python 2.x’in bu durumundan ötürü ben de istihza.com’da 2.x ile ilgili derslere ağırlık veriyorum. Daha önce yaptığımız bir anketin sonucuna göre de  istihza.com kullanıcıları ağırlıklı olarak 2.x serisini kullandığı için sitedeki 3.x belgelerini uzun süredir güncellemiyordum.

Ancak son dönemlerde Python 3.x gelişimi konusunda belli bir hızlanma söz konusu… Bu sebeple ben de istihza.com kullanıcılarına şöyle bir soru yöneltmek istiyorum:

istihza.com’da Python 2′ye mi yoksa Python 3′e mi ağırlık verilmeli?

Bu soruya cevap bulabilmek için yeni bir anket hazırladım. Ankete, sayfanın sağ tarafındaki “Polls” başlığı altından ulaşabilirsiniz. Anketten çıkacak sonuca göre ya Python 2.x belgelerini son hızla güncellemeye devam edeceğim, ya da ağırlığı Python 3.x belgelerine vereceğim.

istihza.com , , ,

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 , , , ,

rstab Modülü

Pazar, 14 Mar 2010

reStructuredText belgeleriyle haşır neşir olanların çok iyi bildiği gibi, rST tabloları oluşturmak tam bir eziyettir. Mesela şu tabloya bir bakın:

+----------+----------+----------+----------+
| İSİM     | SOYİSİM  | ADRES    | MESLEK   |
+==========+==========+==========+==========+
| Ferhat   | Gider    | İstanbul | Yazar    |
+----------+----------+----------+----------+
| Ahmet    | Erden    | Ankara   | Çevirmen |
+----------+----------+----------+----------+
| Mehmet   | Artır    | İzmir    | Çizer    |
+----------+----------+----------+----------+
| Kezban   | Güler    | Adana    | Mühendis |
+----------+----------+----------+----------+
| Selin    | Güleç    | Bursa    | Öğretmen |
+----------+----------+----------+----------+
| Selim    | Gelir    | İzmit    | Esnaf    |
+----------+----------+----------+----------+

Gördüğünüz gibi, rST tablosu oluşturmak için kol kuvvetini devreye sokmak gerekiyor. rST tablolarının bu durumu nedeniyle ben rST belgeleri hazırlarken olabildiğince tablo kullanmaktan kaçıyorum. Ama geçen gün, yakında istihza.com’a ekleyeceğim bir makale üzerinde çalışırken tablo oluşturmam gerekti. Ben de bunun üzerine bu sorunu kökünden çözecek bir şeyler yapmaya karar verdim ve “rstab” adını verdiğim bir modül yazdım.

rstab modülünü http://www.istihza.com/rstab/rstab-0.1/anakaynak/rstab-0.1.tar.gz adresinden indirebilirsiniz.

Bu modül, bir liste içine demet halinde girilmiş verilerden rST tabloları oluşturur. Nasıl mı? Mesela yukarıdaki tabloyu rstab modülüyle oluşturmak için şöyle bir betik yazmamız yeterli olacaktır:

from rstab import *
 
kişiler = [("İSİM", "Ferhat", "Ahmet", "Mehmet",
                    "Kezban", "Selin", "Selim"),
 
           ("SOYİSİM", "Gider", "Erden", "Artır",
                       "Güler", "Güleç", "Gelir"),
 
           ("ADRES", "İstanbul", "Ankara", "İzmir",
                     "Adana", "Bursa", "İzmit"),
 
           ("MESLEK", "Yazar", "Çevirmen", "Çizer",
                      "Mühendis", "Öğretmen", "Esnaf")
          ]
 
Tablo(kişiler).tablo_oluştur()

Gördüğünüz gibi, ilk iş olarak rstab modülünü içe aktarıyoruz. Kullanım kolaylığı açısından rstab modülünü from rstab import * şeklinde içe aktarabilirsiniz. Modülü içe aktardıktan sonra, tablo içeriğini oluşturacak verileri hazırlıyoruz. Yaptığımız şey esasında basit bir liste oluşturmaktan ibarettir. Her sütunu ayrı bir demet olarak gösterdiğimize dikkat edin. Mesela kişiler adlı listedeki ilk demetimiz şudur:

("İSİM", "Ferhat", "Ahmet", "Mehmet",
 "Kezban", "Selin", "Selim"),

Bu demetin ilk öğesi (yani “İSİM”), sütunun başlığı olacaktır. Geri kalan öğeler ise sütunun geri kalanını meydana getirecek.

Tablodaki sütun başlıklarını ve sütun içeriklerini yukarıdaki şablona göre oluşturabilirsiniz.

Tablo içindeki verileri hazırladıktan sonra şu satırı yazıyoruz:

Tablo(kişiler).tablo_oluştur()

Burada “rstab“ modülü içindeki “Tablo“ adlı sınıfın “tablo_oluştur()“ adlı fonksiyonunu çağırdık. Ayrıca “Tablo“ sınıfına parametre olarak, yukarıda oluşturduğumuz “kişiler“ adlı tabloyu verdiğimize dikkat edin.

Artık betiğimizi çalıştırabiliriz.

Yalnız unutmamamız gereken şey, rstab modülünün bir Python 3 betiği olduğudur. Dolayısıyla bu modülü çalıştırabilmek için Python’un 3.x sürümlerinden birini kullanmalısınız.

Yukarıdaki betiği deneme.py adlı bir dosyaya kaydettiğinizi varsayarsak, şöyle bir komut işimizi görecektir:

python3 deneme.py
Bu komutu verdiğinizde şöyle bir çıktı alacaksınız:
+----------+----------+----------+----------+
| İSİM     | SOYİSİM  | ADRES    | MESLEK   |
+==========+==========+==========+==========+
| Ferhat   | Gider    | İstanbul | Yazar    |
+----------+----------+----------+----------+
| Ahmet    | Erden    | Ankara   | Çevirmen |
+----------+----------+----------+----------+
| Mehmet   | Artır    | İzmir    | Çizer    |
+----------+----------+----------+----------+
| Kezban   | Güler    | Adana    | Mühendis |
+----------+----------+----------+----------+
| Selin    | Güleç    | Bursa    | Öğretmen |
+----------+----------+----------+----------+
| Selim    | Gelir    | İzmit    | Esnaf    |
+----------+----------+----------+----------+

Artık bu tabloyu kopyalayıp, rst belgelerinizde kullanabilirsiniz. Bu tablo, HTML çıktısında şöyle görünür:

İSİM SOYİSİM ADRES MESLEK
Ferhat Gider İstanbul Yazar
Ahmet Erden Ankara Çevirmen
Mehmet Artır İzmir Çizer
Kezban Güler Adana Mühendis
Selin Güleç Bursa Öğretmen
Selim Gelir İzmit Esnaf

Eğer tablo çıktısını komut satırından kopyalamak yerine bir dosyaya kaydetmek isterseniz şu komutu verebilirsiniz:

python3 deneme.py > tablo.txt

Bu komut, tabloyu tablo.txt adlı bir dosyaya kaydedecektir.

Modülle ilgili sorularınız için kistihza [at] yahoo [nokta] com adresinden bana ulaşabilirsiniz.

Python, Yazılım , , , , ,

Sphinx Tabanlı Python 3.x Bölümü Yayımlandı

Cumartesi, 29 Ağu 2009

Dün de söylediğim gibi, Sphinx adlı bir yazılım yardımıyla reST biçimli belgelerden otomatik olarak html ve pdf gibi formatlarda belgeler oluşturabiliyoruz. Python programlama dili ile yazılmış bir uygulama olan Sphinx, programcıların ve belgelendirme faaliyetleriyle uğraşanların hayatını bir hayli kolaylaştıran bir araçtır. Sphinx hakkında geniş bilgiye http://sphinx.pocoo.org/ adresinden; reST hakkında geniş bilgiye ise http://docutils.sourceforge.net/rst.html adresinden ulaşabilirsiniz.

istihza.com’daki belge sayısının sürekli olarak artması nedeniyle ben de Sphinx benzeri bir uygulamaya uzun süredir ihtiyaç duyuyordum. Başka alternatifler arasından Sphinx’i seçmemin en önemli nedeni, Python’un resmi sitesi olan http://www.python.org adresindeki belgelendirme çalışmalarının da Sphinx yardımıyla yürütülüyor olmasıdır. http://docs.python.org/ adresinde gördüğünüz belgelerin tamamı Sphinx kullanılarak hazırlanıyor.

Sphinx üzerinde ilk kez çalışmaya başladığımda, bu yazılımın esasen İngilizce yazılmış belgelerin üretiminde kullanılmaya uygun olduğunu görmek beni biraz endişelendirmişti.

Sphinx’in desteklediği diller arasında Türkçe bulunmuyor. Dolayısıyla ilk iş olarak Sphinx’in arayüzünü Türkçe’ye çevirmem gerekti. Bu sorunu hallettikten sonra, Python 3.x bölümündeki belgeleri HTML biçiminden reST biçimine dönüştürmeye başladım. Burada da karşıma renklendirme sorunu çıktı… Sphinx’in kod renklendirmesinde kullandığı Pygments modülü Türkçe karakterleri renklendirirken olmadık yerlerde sorun çıkarabiliyor. Bu yüzden Python 3.x içindeki bazı kodları yeniden düzenlemem gerekti. Python’un 3.x sürümünde değişkenlere Türkçe karakter içeren adlar verebiliyoruz, ama ne yazık ki Pygments modülü bu Türkçe karakterli adları renklendirmekte zorlanıyor… Bu yüzden bazı yerlerde Türkçe karakterli değişken adlarını değiştirmem gerekti… Bu sorunu da hallettikten sonra usul usul ilerlerken daha büyük bir problemle karşı karşıya olduğumu farkettim. Sphinx’in ürettiği html dosyalarının url adreslerindeki kalıcı bağlantılar Türkçe karakterlerin yerine “-” işareti koyuyordu. Yani mesela “kullanıcıyla-iletişim-input-fonksiyonu” gibi bir başlık, Sphinx’le üretilen html belgesinde “kullan-c-yla-ileti-im-input-fonksiyonu” şeklinde görünüyordu… En mantıklı yol, Sphinx’in bu kalıcı bağlantıyı “kullaniciyla-iletisim-input-fonksiyonu” şeklinde üretmesini sağlamak olacaktı. Epey uğraştıktan sonra sorunun aslında Docutils modülünden kaynaklandığını farkettim. Sorunu çözebilmek için kendi sistemimde bulunan Docutils içindeki “nodes.py” dosyasında değişiklik yapmam gerekti. Bu noktada açık kaynak ve özgür yazılım denen şeyin ne kadar büyük bir nimet olduğunu bir kez daha anladım. Eğer Sphinx ve Docutils yazılımları kapalı kaynaklı olsaydı, ben bunların kaynak kodlarını inceleme fırsatına sahip olmayacağımdan, sorunun nerede olduğunu bilemeyecek ve gerekli düzeltmeyi yapamayacaktım… Bu vesileyle özgür yazılımın babası Richard Stallman’ı bir kez daha saygıyla selamlıyorum…

Şu anda Sphinx ve html belgeleriyle ilgili herhangi bir problem yok. Çözemediğim tek problem LaTex yazılımının, pdf belgelerine Türkçe başlıklar koyamaması… Bu yüzden Sphinx ile oluşturduğum PDF belgelerinde “Contents”, “Documentation” ve “Section” gibi kelimeleri Türkçe’ye çevirmedim. Çok büyük bir sorun değil, ama eğer bununla ilgili çözüm önerisi olan varsa dinlemekten memnuniyet duyarım.

istihza.com’daki, Sphinx ile hazırlanmış yeni Python 3.x bölümüne ulaşmak için http://www.istihza.com/py3/icindekiler_python.html adresini ziyaret edebilirsiniz. Bu belgeleri PDF biçiminde bilgisayarınıza indirmek için ise http://www.istihza.com/py3/pdf/Python3x.pdf adresine tıklayabilirsiniz.

Belgeler arasında daha rahat gezinmeyi de sağlaması açısından Sphinx yazılımı kullanıcıya da önemli kolaylıklar sağlıyor. istihza.com’daki bu değişikliği beğeneceğinizi umuyorum.

Python, Yazılım , , ,

Python 3.x için ikinci PDF Dosyası

Salı, 18 Ağu 2009

Daha önce de duyurduğumuz gibi, istihza.com’un katkıcılarından Sayın Metehan Özbek, Python3.x bölümüne eklenen konuları bir PDF dosyası haline getirip bana göndermişti. Ben de bu PDF dosyasını istihza.com’da yayımlamıştım. Ancak Python 3.x bölümüne sürekli olarak yeni konular eklendiği için bu PDF dosyası kaçınılmaz olarak eskiyordu. Bugün Metehan Özbek, Python 3.x bölümüne son eklenen konuları da içeren bir PDF dosyası daha hazırladığını haber verdi bana. 18 Ağustos 2009 tarihine kadar Python 3.x bölümüne eklenmiş olan bütün konuları içeren bu pdf dosyasına şu adresten erişebilirsiniz.

Ancak yine hatırlatmakta fayda var: Python 3.x bölümü oldukça dinamik bir bölümdür. Bu bölüme hem sık sık yeni konular eklenmekte, hem de eski konular sürekli olarak gözden geçirilmektedir. Dolayısıyla Python 3.x bölümüne ait PDF dosyaları kaçınılmaz olarak çok kısa bir süre içinde eskiyecektir.

Sürekli olarak değişen Python3.x bölümünü bıkmadan PDF dosyası haline getirme zahmetine katlanan Sevgili Metehan Özbek’e tekrar teşekkür ederim.

Sevgiler,

istihza

Python ,

Python 3.x Bölümü için ilk PDF Dosyası

Cumartesi, 01 Ağu 2009

Uzun bir aradan sonra tekrar bilgisayarımın başına dönebildim. Ne zamandır düzgün bir tatil yapma imkanım olmuyordu. Bu sene hem kendi memleketimde (Adana-Mersin) hem de eşimin memleketinde (Zonguldak) güzel bir üç hafta geçirdim…

Tatildeyken, sitemizin takipçilerinden Metehan Özbek’ten güzel bir haber aldım. Kendisi büyük bir özveri göstererek Python 3.x bölümüne şu ana kadar eklenmiş olan dersleri bir PDF dosyası haline getirmiş. Metehan Özbek’e verdiği emek için çok teşekkür ederim. Oldukça kaliteli bir çalışma çıkarmış ortaya. Bu PDF dosyasını şu adresten indirebilirsiniz:

http://www.istihza.com/python3/Python3x–26_Temmuz_2009.pdf

Python2.x bölümünün aksine, Python 3.x bölümünün geliştirilmesine devam edildiği için bu belge kaçınılmaz olarak eskiyecektir. Bu PDF dosyasının belirli aralıklarla güncellenip bana gönderilmesi halinde güncellenmiş dosyayı istihza.com’da yayımlamaktan memnuniyet duyacağımı belirtmek isterim.

Sabır ve özveri gösterek böyle güzel bir PDF dosyası oluşturan ve bunu bana gönderme inceliğini gösteren Sevgili Metehan Özbek’e tekrar teşekkür ederim.

Python , ,

Hangisinden Başlamalı? Python 2.x mi yoksa 3.x mi?

Salı, 21 Nis 2009

Sıkça sorulan bir soru olduğu için, bu yazıda “Python’u öğrenmeye hangi sürümle başlamalıyım?” sorusuna genel bir cevap vermeye çalışacağım.

Hepimizin bildiği gibi, Python 3.x sürümleri Python’un 2.x sürümleriyle uyumlu değil. Yani Python 2.x ile yazılmış bir program, Python’un 3.x sürümlerinde çalışmayacaktır. Bu söylediğimin tersi de geçerlidir: Buna göre, Python’un 3.x sürümlerinden biriyle yazdığınız bir programın Python’un 2.x sürümlerinde çalışmasını beklememelisiniz.

Diyelim ki Python programlama dilini öğrenmeye karar verdiniz. Bu dile sıfırdan başlayacak biri olarak acaba hangisini seçmeniz gerekir? Eski sürümü mü? Yoksa yeni sürümü mü?

Python’un 2.x sürümleri çok uzun süredir kullanılıyor. Dolayısıyla yıllar içinde üretilmiş Python programları, üçüncü parti modüller ve belge kaynakları hep 2.x sürümleri temel alınarak hazırlanmış durumda. Henüz ortada Python 3.x’le yazılmış kayda değer bir program olmadığı gibi, hemen her Python programında ihtiyaç duyulan üçüncü parti modüllerin neredeyse hiçbiri henüz Python 3.x’e aktarılmış da değil.

Duruma GNU/Linux dağıtımları açısından bakacak olursak, dağıtımlarda ana Python paketlerinin hep 2.x olduğunu görüyoruz… Yani konsolda “python” komutunu verdiğinizde karşınıza çıkacak Python sürümü 2.x olacaktır (Genellikle 2.5.2 sürümü…)

Python 3.x paketleri henüz dağıtımların depolarında da yer almıyor. Şu anda Python 3.x paketlerini kullanıcılarına sunduğunu bildiğim tek dağıtım Ubuntu Jaunty Jackalope. (Bu dağıtımın kararlı sürümü 23 Nisan’da sunuculardaki yerini alacak).

Python 3.x’i öğrenebilmek için gereken belge kaynakları da henüz kararlı bir duruma ulaşmış değil. Bu konudaki temel başvuru kaynağımız olan resmi belgeler sürekli olarak güncelleniyor. Mesela bu belge en son güncellemeyi bugün görmüş…

Eğer Python programlama dilini öğrenmeye Python 3.x ile başlamak istiyorum diyorsanız, İngilizce bilmek zorundasınız. Çünkü etraftaki üç-beş Python 3.x belgesinin tamamına yakını İngilizce. Üstelik bu kaynaklar da henüz 2.x belgeleriyle kıyas kabul etmeyecek derecede eksik. İngilizce bilmeyen arkadaşlarım için ben naçizane istihza.com’da Türkçe belgelendirme çalışmalarını yürütüyorum. Python 3.x hakkında bilgi edinmek isteyen arkadaşlarım istihza.com‘daki Python 3.x sayfalarına göz gezdirebilir…

Python kullanıcılarını ilgilendiren önemli bir konu da arayüz tasarımı… Python’la arayüz tasarlamak istiyorsanız ve illa Python 3.x kullanacaksanız şu an için elinizdeki tek seçenek Tkinter olacaktır. Ancak Tkinter ile arayüz tasarlarken mutlaka gereksinim duyacağınız PIL (python-imaging) modülü de henüz Python 3.x’e aktarılmış değil. Dolayısıyla Tkinter ile hazırladığınız programlara resim eklemek isterseniz büyük sıkıntı yaşarsınız.

Tkinter’e iyi bir alternatif olarak düşünülebilecek olan wxPython’un durumu ise biraz karanlık… Bu arayüz takımına ait kullanıcı listelerinde geliştiricisinin söylediğine göre, wxPython’un Python 3.x’e taşınabilmesi için henüz doğru dürüst bir hazırlık yapılmış değil…

Sözün özü, Python programlama dilini Python 3.x ile öğrenmek isteyenler kendilerini hareket imkanı kısıtlı bir ortamda bulabilir…

“Python 2.x mi, yoksa 3.x mi?” sorusuna cevap bulabilmek için elbette Python’un baş geliştiricisi Guido Van Rossum’un bu konudaki fikirlerine de kulak vermek gerekir. Kendi sitesinde, http://www.artima.com/forums/threaded.jsp?forum=106&thread=211200 adresinde belirttiğine göre, Python 3.x’i öğrenmeye başlamak için daha 2 yıl beklemek gerekiyor. Guido Van Rossum’un bu yorumu 28 Temmuz 2007 tarihinde yaptığını düşünürsek, 2 yılın dolmasına pek fazla vakit kalmamış gibi görünüyor… Ama şu anki duruma bakılacak olursa, bu “2 yıl” tahminini, yukarıda belirttiğim sebeplerden ötürü birazcık daha uzatmakta fayda var… O yazıda Van Rossum Python öğrenmek isteyenlere 2.6 sürümüyle başlamalarını tavsiye ediyor. Benim fikrim de açıkçası bu yönde. Python’un 2.6 sürümünü hakkıyla öğrenen bir kişi Python 3.x’e uyum sağlamakta zorluk çekmeyecektir, çünkü Python’un 3.x sürümüne ait pek çok özellik Python 2.6 sürümünde de çalışıyor. Ayrıca Python 2.6 ile program yazarken, eğer Python 3.x ile uyumlu olmayan bir kod yazarsanız, Python 2.6, yazdığınız bu kodun 3.x’te çalışmayacağı konusunda sizi uyaracak, bu da Python 3.x’e uyum sağlama açısından size büyük bir kolaylık sağlayacaktır.

Velhasıl-ı kelam, Python’un 2.x sürümleri daha uzun bir süre bizimle beraber olmaya devam edecek. Zaten Python’un resmi belgelerinden de anlaşılacağı gibi, Python 3.x sürümlerinin geliştirilmesi devam ederken, Python 2.x de uzun bir süre destek görmeye ve geliştiştirilmeye devam edecek… Dolayısıyla eğer Python öğrenmeye yeni başlayacaksanız, Python’u öğrenmeye 2.6 sürümüyle başlamalı, bu arada da Python 3.x’teki gelişmelere de kulak kabartmalısınız… Hem zaten eski kodları anlayabilmenin, Python deneyiminiz açısından önemli bir artı olduğunu rahatlıkla söyleyebilirim.

Python , ,

Python 3.x’te Kullanışlı bir Araç: crlf.py

Pazar, 29 Mar 2009

Python, hepimizin bildiği gibi, pek çok platformda çalışabilen bir dildir. Ayrıca Python’da yazılmış bir program, çoğunlukla üzerinde hiç bir değişiklik yapılmadan birden fazla platform üzerinde çalıştırılabilir (tabii programımızı yazarken bazı noktalara dikkat etmek kaydıyla…).

Ancak Python’un bu “taşınabilme kabiliyetini” (portability) zora sokan bazı şeyler de yok değildir… Ben bu yazıda, Python’un taşınabilme gücünü azaltan bir noktaya değineceğim.

Normal olarak bir metin dosyasına herhangi bir şey yazarken, alt satıra geçmek için “enter” tuşuna bastığımız zaman, satır sonları “\n” imiyle işaretlenir. Mesela şöyle bir şey yazdığımızı düşünelim:

#!/usr/bin/env python3.0
print("Elveda Zalim Dünya!")

Şimdi bu betiği .py uzantılı olarak kaydedelim. Daha sonra etkileşimli kabukta bu dosyayı okuyalım:

>>> f = open("deneme.py")
>>> f.read()

Buradan alacağımız çıktı şöyle bir şey olacaktır:

'#!/usr/bin/env python3.0\nprint("Elveda Zalim Dünya!")\n'

Gördüğünüz gibi, satır sonları “\n” kaçış dizisi ile gösteriliyor. Ancak aslında bu Unix tarzı bir satır sonlandırma biçimidir. Özellikle Windows platformunda bazı metin düzenleyiciler satır sonlarını daha farklı bir şekilde işaretliyor. Yani Windows platformunda yazdığınız bir betik, yukarıdaki “read()” metoduna şöyle bir cevap verebilir:

'#!/usr/bin/env python3.0\r\nprint("Elveda Zalim Dünya!")\r\n'

Gördüğünüz gibi, satır sonları “\n\r” şeklinde çıkıyor. Satır sonlarının bu şekilde gösterildiği bir betiği Windows’tan GNU/Linux’a taşıdığınız zaman, betiğin ilk satırı “#/usr/bin/env python3.0″ olsa ve siz bu betiği “çalıştırılabilir” olarak ayarlasanız dahi, bu betik “./deneme.py” gibi bir komut yardımıyla konsoldan çalıştırılamayacaktır. Betiği bu şekilde çalıştırmayı denediğinizde konsoldan şöyle bir cevap alabilirsiniz:

: No such file or directory

Halbuki siz “böyle bir dosya veya dizinin” varolduğunu biliyorsunuz… İşte burada sorun biraz önce bahsettiğimiz satır sonu karakterlerinin farklı olmasından kaynaklanıyor. GNU/Linux kabuğu satır sonunda sadece “\n” yerine “\n\r” görünce kafası karışıyor. Dolayısıyla betiğimizi çalıştıramıyor. Bizim burada yapmamız gereken şey satır sonlarının hepsini “\n” şekline çevirmek. İşte başlıkta adı geçen “crlf.py” bu iş için yazılmış bir Python betiğidir. Bu betik, “python3.0/examples/Tools” yolu içinde bulunur. Mesela benim sistemimde bu betiğin bulunduğu tam yol şöyle:

/usr/share/doc/python3.0/examples/Tools/scripts/crlf.py

Eğer Python’u kaynaktan kurmuşsanız, bu betik muhtemelen şu yol üstünde olacaktır:

/Python-3.0.1/Tools/scripts/crlf.py

Peki bu betiği nasıl kullanacağız? İşin ilginç yanı, bu betik Python3.0 dizini altında bulunuyor olsa da aslında Python’un 3.x sürümleriyle uyumlu değil! Dolayısıyla bu betiği “python3″ ile değil “python” ile çalıştıracağız. Mesela satır sonları problemli, “deneme.py” adlı bir betiğimiz olduğunu varsayalım. Bu betiğin satır sonlarını şu komut yardımıyla düzeltiyoruz:

python /usr/share/doc/python3.0/examples/Tools/scripts/crlf.py deneme.py

Bu işlemden sonra aynı dosyaya “read()” metodunu uyguladığımda bütün “\r\n” işaretlerinin “\n”ye dönüştüğünü görüyorum. Artık betiğimi GNU/Linux üzerinde rahatlıkla çalıştırabilirim.

Bu tür sorunlarla karşılaşmamak için, programlarımızı yazacağımız metin düzenleyici veya “IDE”leri çok iyi seçmemiz gerekir. Kullandığınız aracın satır sonlarını nasıl işaretlediğini mutlaka kontrol edin. Aksi halde yazdığınız programlar, basit bir nedenden ötürü farklı platformlar üzerinde çalışmayacaktır.

Örneğin Windows’taki “Notepad++” adlı düzenleyicinin, satır sonlarını “\r\n” şeklinde işaretlediğini biliyorum. “IDLE” ise satır sonlarını “\n” şeklinde işaretler. Dolayısıyla Notepad++ ile yazdığınız programlar “taşınabilir” olmazken, IDLE ile yazdığınız programlar “taşınabilir” olacaktır…

Python , , , , , , , , , ,

Python 3.x ve Türkçe Desteği

Çarşamba, 25 Mar 2009

Python’la elini kirletmiş olanların aşina olduğu gibi, Python’un 2.x sürümlerinde Türkçe desteği tam değil. Bazı noktalarda Türkçe karakterleri düzgün olarak gösterebilmek için türlü taklalar atmamız gerekebiliyor. http://www.istihza.com/makale_lenascii.html adresindeki makalede belirttiğim gibi, bu sorunlar Python’un varsayılan kod çözücüsünün “ascii” olmasından kaynaklanıyor. Ancak Python 3.x ile beraber Türkçe sorunları büyük ölçüde çözüldü. Neden? Çünkü artık Python’un varsayılan kod çözücüsü “ascii” değil “utf-8″… Bunu şu şekilde teyit edebiliriz:

>>>import sys
>>>sys.getdefaultencoding()

Bu komutun çıktısı, 2.x sürümlerinin aksine “utf-8″ olacaktır. Bu çıktı, Türkçe program yazanlar için büyük önem taşıyor. Mesela artık bir liste tanımlayıp, listenin öğelerini ekrana yazdırmak istediğimiz zaman rahatlıkla şu kodları yazabiliriz:

>>>liste = ["çilek", "şelale", "yıldız", "kağıt"]
>>>print(liste)

Aynı kodları 2.x sürümlerinde denediğimizde şöyle bir sonuç alırız:

>>> print liste
['\xc3\xa7ilek', '\xc5\x9felale', 'y\xc4\xb1ld\xc4\xb1z', 'ka\xc4\x9f\xc4\xb1t']

Mesela len(“ç”) gibi bir fonksiyon da artık doğal olarak “1″ çıktısını verecektir…

Bütün bu güzel gelişmelere karşın, çözülmemiş tek bir sorun kalmış gibi görünüyor. O da karakter dizilerinin upper() metoduyla ilgili… Şu örneğe bir bakalım:

>>> for i in liste:
...     print(i.upper())
...
ÇILEK
ŞELALE
YILDIZ
KAĞIT

Gördüğünüz gibi, “i” harfi noktasız olarak büyütülüyor… Ama http://bugs.python.org/msg55478 adresindeki bilgiden anlıyoruz ki bu sorun aslında doğrudan Python’la ilişkili değil…Yine de Python’daki Türkçe sorununun büyük ölçüde halledilmiş olması hepimiz için sevindirici bir haber…

Python , , ,

Python 3.x — İlk Belgeler

Çarşamba, 11 Mar 2009

Bugünden itibaren istihza.com’da Python 3.x sürümlerini de belgelendirmeye başladık… İlk belgelere şuradan ulaşabilirsiniz: http://www.istihza.com/python3/icindekiler_python.html

Elbette bu sayfa henüz yapım aşamasındadır. Zamanla öteki belgeler de o bölüme eklenecektir. Ayrıca anasayfadaki “PYTHON” başlığını “PYTHON 2.x” ve “PYTHON 3.x” olarak ayırdım. Yakın zamanda “TKINTER” de “TKINTER 2.x” ve “TKINTER 3.x” olarak ayrılacak…

Gördüğüm kadarıyla pek çok dağıtımda Python 3 paketlenmemiş durumda. Python’u kaynaktan kuracak olan arkadaşlarımın, yeni belgelerdeki “Python Nereden İndirilir?” kısmını dikkatli okumalarını öneririm. Tekrar hatırlatayım: GNU/Linux’ta Python’u kaynaktan kurmak bazı sorunları da beraberinde getirebilir. Özellikle Python’un sistemle iç içe olduğu dağıtımlarda birazcık daha dikkat ve özen göstermekte yarar var.

İyi çalışmalar dilerim

istihza

Python ,