a Pythonic | evieplus Academy | Bilgi Teknolojileri Platformu

Pythonic

Pythonic nedir?

"Pythonic" ne anlama geliyor?

Bu soru EuroPython konferansını planlamak için kullanılan EuroPython posta listesinde sorulan bir soruydu. Yine de ilginç bir soruydu. Kelimenin çok kullanıldığını fark ettim, ancak ne anlama geldiğini açıklamaya yönelik herhangi bir girişim görmedim.

"Pythonic" belirsiz bir kavramdır, ancak onları gerçekten tanımlamaya çalıştığınızda kaygan olma eğiliminde olan "zeka" veya "yaşam" gibi kavramlardan çok daha belirsiz olması gerekmez. Tanımlamanın zor olması, işe yaramaz oldukları anlamına gelmez; insanlar karmaşık tanımlarla iyi çalışır. "Pythonic", "Python'ca" gibi bir anlama gelir, ancak şimdi bunun gerçekte ne anlama geldiğini açıklamamız gerekecek.

Zamanla, Python dili geliştikçe ve topluluk büyüdükçe, Python'un doğru şekilde nasıl kullanılacağına dair birçok fikir ortaya çıktı. Python dili, çok sayıda deyimi bir dizi görevi ("bunu yapmanın tek yolu") gerçekleştirmeye aktif olarak teşvik eder. Buna karşılık, Python topluluğunda gelişen yeni deyimler, onları daha iyi desteklemek için dilin evrimini etkiledi. Daha önce has_key() ve öğe erişiminin kombinasyonuyla yapılabilecekleri tek bir işlemde birleştiren sözlüklere ait get fonksiyonu yönteminin tanıtımı, böyle bir evrimin bir örneği olarak düşünülebilir.

Deyimler genellikle başka bir programlama dilinden kolayca taşınabilir değildir. Örneğin, C'deki bir listedeki tüm öğeler üzerinde bir işlem gerçekleştirmenin deyimsel yolu şuna benzer:

for (i=0; i < mylist_length; i++) {
   do_something(mylist[i]);
}

Python'daki doğrudan eşdeğer şu olacaktır:

i = 0
while i < mylist_length:
   do_something(mylist[i])
   i += 1

Ancak bu, çalışırken Pythonic olarak kabul edilmez. Python dilinin teşvik ettiği bir deyim değil. Onu geliştirebiliriz. Python'da bir listedeki tüm sayıları üretmek için kullanılan tipik bir deyim, yerleşik range fonksiyonu gibi bir şey kullanmak olacaktır:

for i in range(mylist_length):
   do_something(mylist[i])

Ancak bu Pythonic de değildir. İşte dilin kendisi tarafından teşvik edilen Pythonic yolu:

for element in mylist:
   do_something(element)

Comp.lang.python'da sıkça sorulan bir soru, referansların doğrudan nasıl geçirileceği veya değiştirileceğini içerir, bu Python'da mümkün olmayan bir şeydir; sadece atama var (ve yakın akrabaları import, class ve def ifadeleri). Bu şüphesiz bazen bir işlevden birden çok değer döndüren kod yazma arzusundan kaynaklanır. Bunu C ve diğer birçok dilde yapmanın deyimsel yolu, bu işlev işaretçilerine veya referanslarına geçmektir:

void foo(int* a, float* b) {
    *a = 3;
    *b = 5.5;
}

...
int alpha;
int beta;
foo(&alpha, &beta);

Python'da, işlev sonuçlarını aşağıdaki gibi bağımsız değişkenlerden geçirmek için stratejileri kesmek mümkündür:

def foo(a, b):
    a[0] = 3
    b[0] = 5.5

alpha = [0]
beta = [0]
foo(alpha, beta)
alpha = alpha[0]
beta = beta[0]

Bununla birlikte, bir işlevden birden çok değer döndürmenin deyimsel yolu oldukça farklı ve çok daha hoş göründüğünden, bunun çığlık atacak derecede ruhani olmadığı düşünülmektedir. Demetleri ve tuple paketlerini açmayı kullanır:

def foo():
    return 3, 5.5

alpha, beta = foo()

Pythonic olmayan kod, deneyimli bir Python programcısına tuhaf veya hantal görünme eğilimindedir. İstenilen etkiyi elde etmek için ortak, tanınabilir, kısa bir deyim kullanmak yerine, başka, daha uzun bir kod dizisi kullanıldığı için aşırı derecede ayrıntılı ve anlaşılması daha zor olabilir. Dil doğru deyimleri destekleme eğiliminde olduğu için, deyimsel olmayan kod da sıklıkla daha yavaş çalışır.

Pythonic olmak, Python yapılarını ve veri yapılarını temiz, okunabilir deyimlerle kullanmaktır. Pythonic, örneğin dinamik yazımdan yararlanmaktır ve gerekli olmayan yerlerde resme statik tipte ayrıntıyı katmak kesinlikle Pythonic değildir. Pythonic olmak, şaşırtıcı deneyimli Python programcılarından bir görevi yerine getirmek için alışılmadık yollardan kaçınmaktır.

"Pythonic" kelimesi, düşük seviyeli deyimlerin ötesinde de kullanılabilir. Bir kitaplık veya çerçevenin Pythonic olması, bir Python programcısının bir görevi nasıl gerçekleştireceğini algılamasını olabildiğince kolay ve doğal hale getirmektir. Bir kitaplık veya çerçeve, Python'da yazılmış olmasına rağmen, programcıların hantal veya deyimsel olmayan Python kodu yazmasını gerektiriyorsa, ruhani olmayan kabul edilebilir. Belki de, kütüphaneyi daha rahat veya anlaşılır hale getirseler bile, sınıflar gibi Python tekliflerini kullanmıyor. İşlevlerin ve yöntemlerin işlevlere argüman olarak aktarılmasına izin verilmesi gibi olasılıklar, kullanışlı olabilecekleri yerlerde gözden kaçabilir. Bir kitaplıkta tanımlanan bir sınıf, Java gibi bir dilde olduğu gibi bilgi gizlemeyi zorlamak için elinden gelenin en iyisini yapmaya çalışırken, Python daha çok özniteliklerin tipik olarak mevcut olduğu ancak programcının ima edildiği 'danışma kilitleme' daha gevşek stratejisi altında çalışır. Önde gelen bir alt çizgi ile mahremiyetleri hakkında.

Tabii ki, bu kadar büyük bir ölçeğe, kütüphanelere ve çerçevelere geldiğinizde, bir şeyin Pythonic olup olmadığı daha tartışmalı hale geliyor. Yine de bazı kurallar var. Birincisi, daha az ayrıntı: Python kitaplıklarının API'leri, aynı şeyi yapan Java kitaplıklarından daha küçük ve daha hafif olma eğilimindedir. Ağır, fazla ayrıntılı bir API'ye sahip Python kitaplığı çok "Pythonic" olarak kabul edilmez. Örneğin, Python'da birkaç kez uygulanan W3C XML DOM API, Pythonic olarak kabul edilmiyor. Bazı insanlar bunun "Java-esque" olduğunu düşünüyor, ancak duyduğuma göre aslında birçok Java programcısı tarafından Java'ya benzemiyor ...

Python tabanlı bir çerçeve, aynı şeyi başarmak için zaten dil deyimlerinin olduğu yerde tekerleği çok fazla yeniden icat etmeye çalışmazsa Pythonic olarak kabul edilebilir. Ayrıca deyimlerle ilgili yaygın Python kurallarını da takip etmelidir.

Elbette sorun şu ki, çerçeveler olan çerçeveler, neredeyse kaçınılmaz olarak, daha küçük uygulamalara alışkınsanız aşina olmayabilecek şeyleri yapmanın kalıplarını ve yollarını sunmaya çalışıyor. Bir çerçevenin gücünü böyle sömürüyorsunuz. Çok yakından tanıdığım bir çerçeve olan Zope 2, başka yerlerde çok sık karşılaşmadığınız şeyleri yapmanın birçok özel yolunu kesinlikle tanıtan bir çerçeve örneğidir. Edinme bir örnektir. Sonuç olarak, birçok deneyimli Python programcısı tarafından pek Pythonic olarak görülmemektedir.

Bir Pythonic framework'ü oluşturmak zordur. Neyin havalı, deyimsel, iyi Python kodu kavramının yıllar içinde önemli ölçüde gelişmesi gerçeğine yardımcı olmuyor. Üreteçler, setler, unicode dizgeleri ve veri zamanları gibi özellikler artık Pythonic olarak kabul edilmektedir. Zope 2, yaşını kesinlikle orada gösteren bir framework örneğidir ve kısmen 1997'de geliştirildiği için suçlanamaz. Bunu düşünürsek, gerçekten çok iyi dayanıyor, teşekkürler.

Son yıllarda Pythonicness'teki yeni bir trend örneği, Python'daki paket ve modül yapısının deyimlerini standartlaştırma yönündeki harekettir. Twisted, Zope 3 ve PyPy gibi daha yeni kod tabanlarının tümü aşağı yukarı bu kalıbı takip eder:

  • paket ve modül adları kısa, küçük harfli ve tekildir
  • paketler genellikle yalnızca ad alanı paketleridir, yani boş __init__.py dosyalarına sahiptir.

Bazen yazılımın 'pythonic olmayan' olarak kınanmasının bir şekilde haksız olabileceğini ve yazılımın diğer olumlu yönlerini gizleyebileceğini düşünüyorum. Bir Python programcısı için seçmesi kolay olan daha az güçlü bir çerçeve, öğrenmesi daha fazla zaman yatırımı gerektiren çok daha güçlü bir sistemden daha Pythonic olarak kabul edilebilir.

Son olarak, Pythonic tasarımının ne olduğuna dair başka bir tamamlayıcı bakış açısı için, aşağıdakileri bir python yorumlayıcıda deneyin:

import this