Python 2.x ve 3.x Arasındaki Bazı Farklılıklar
Python 2'den 3'e geçiş aşamasında, el altında bulundurmak için, en sık ihtiyaç duyulacağını düşündüğüm farklılıklar, ve 2'den 3'e geçme ipuçlarının bir listesinden oluşan kısa bir rehber oluşturma ihtiyacı hissettim. Benim gibi bu aşamada el altında bir geçiş rehberi bulundurmak isteyenlerle de paylaşmış olmak için, blogumdan yazayım dedim. Eksikleri farkettikçe buraya ekleyeceğim.
Bilgilerin kaynakları (Şimdilik tek kaynak): Python Belgeleri
Not: Eğer python öğrenmeye başlayacaksanız, ve hangi sürümden başlayacağınıza karar vermeye çalışıyorsanız, bu rehberin size pek bir faydası olmayacaktır. Python 2.6 veya 2.7 ile öğrenmeye başlayın. Ancak, kodlarınızı çalıştırırken python yorumlayıcısını "-3" anahtarıyla başlatın. Böylece, python 3'de değişen özelliklerle ilgili bilgi alabilirsiniz. Örneğin:
Eğer python konusunda deneyimliyseniz, ve python 3'e geçiş yapacaksanız, okumaya devam edin.
Python 3'de unicode() yok
Unicode objeleri, str objeleri, bytearray objeleri ve bunlar arasında işlem yapmak çok kaygan bir zemindi, python 3'de bu işe de bir el atıldı.
- Python 3'de yazı ve byte var. Tüm yazılar unicode.
- unicode objesi yok, python 3'de yazılar str objesi kullanıyor, ancak bunlar python 2 deki unicode'lar gibi.
- Bir önceki madde dolayısıyla, u"..." da python 3'de yok!
- İki önceki madde dolayısıyla unichr() fonksiyonu da yok. chr() fonksiyonu unichr() gibi oldu.
- Yazılar ve byte'lar arasında işlem ve karşılaştırma yok.
- yazı -> byte : str.encode() yada, bytes(str,encoding="bir kodlama")
- byte -> yazı : byte.decode() yada, str(byte,encoding="bir kodlama")
- byte ve yazı objelerinde yerinde değiştirme yapılamıyor (mutable değil), bunun için bytearray() var. byte kullanacağınız neredeyse her yerde bytearray kullanabilirsiniz.
Python 3'de except ve raise
Hata yakalama ve ayıklama konusunda da bazı değişiklikler oldu. En önemli değişiklik, artık raise ile kullanacağınız exception, doğrudan veya dolaylı olarak BaseException sınıfının bir alt sınıfı olmak zorunda. Python 3'e geçiş yaparken, eğer BaseException sınıfının alt sınıfı olmayan herhangi birşeyi raise ile kullanıyorsanız, bunları baştan yazmanız gerekecek. Ancak halen tavsiye edilen, kendi hatalarınızı Exception sınıfının bir alt sınıfı olarak yazmanız. Bununla birlikte, yazımda da değişiklikler oldu.
|
# python 2.x
|
|
raise Hata, arguman
|
|
# python 3.x
|
|
raise Hata(arguman)
|
|
|
|
# python 2.x
|
|
except Hata, degisken:
|
|
print(degisken.ozellik)
|
|
# python 3.x
|
|
except Hata as degisken:
|
|
print(degisken.ozellik)
|
reduce() callable() gibi fonksiyonlar yok.
Hepsini yazmak uzun olacak diye, önemli bulduklarımı yazdım.
- dict.has_key(a) kullanımı kalktı, bunun yerine "a in dict" kullanmak gerekiyor.
- callable(a) kalktı. Bunun yerine issubclass(a,collections.Callable). Bunun hakkındaki şahsi görüşüm saçmalığın daniskası olduğu yönünde.
- reduce() fonksiyonu da kalktı. Bunun yerine for döngüsü kullanın diyorlar. İlla ki reduce kullanmak isteyenler functools.reduce() kullanacaklarmış.
- raw_input(), input() olarak adlandırıldı. Eski input davranışı için eval(input()) kullanın deniliyor.
Burada yazılanlar tüm değişiklikleri kapsamıyor. Sadece, kendi en sık kullandığım python özelliklerini göz önünde bulundurarak, değişiklikleri özet geçtim. Buraya eklenmesi gereken birşey olduğunu düşünüyorsanız, yorumlarda belirtebilirsiniz.
Son bir not olarak, python 3'e geçiş için henüz çok erken olduğunu düşünüyorum. Halen python 3'ün ne olduğu belirsiz ve aktif geliştirilmesi devam ediyor. Ben şahsen, 3.5 gibi geçmeyi düşünüyorum.