koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da Girintiler (indentation)

Python’da, kontrol ve döngü yapılarını tanımlamak için girintileri (indentation) kullanırız. Bu şekilde Python kodlarının okunabilirliği kolaylaşsa da boşluk kullanımına çok dikkat etmemiz gerekir. Bu nedenle, düzenleyicinin yanlış kalibrasyonu beklenmedik şekillerde davranan kodla sonuçlanabilir.

Python’da parantez yerine ne kullanılır?

Python’da, kod bloklarının nerede başladığını göstermek için iki nokta üst üste simgesini (:) kullanırız. İki nokta üst üste ve girinti sayesinde kod bloklarının başlangıcını ve bitişini belirleriz. (Başka bir dilden geliyorsanız, bunu bir şekilde üçlü operatörle ilişkili olmakla karıştırmayın). Yani Python’daki işlevler, döngüler, if ifadeleri ve diğer blokların son tanımlayıcıları yoktur. Tüm bloklar iki nokta üst üste ile başlar ve ardından altındaki girintili satırları içerir.

Örneğin:

def my_function():    
    # Fonksiyon tanımlaması. İki nokta üst üste işaretine dikkat (:)    
    a = 2             # Bu satır girintili olduğu için fonksiyona ait    
    return a          # Bu satır da girintili olduğu için aynı fonksiyona ait  
# Bu satır fonksiyonun DIŞINDA

veya

if a > b:             # If yapısı burada başlar
    print(a)          # Bu satır if yapısının içerisinde
else:                 # else, if ile aynı girintide olmalı
    print(b)          # Bu satır else yapısının içerisinde

Tam olarak bir tek satırlık ifade içeren blokları aynı satıra yerleştirilebiliriz, ancak bu form genellikle iyi bir stil olarak kabul edilmez:

if a > b: print(a) else: print(b)  

Bunu birden fazla ifadeyle yapmaya çalışmak ise işe yaramayacaktır:

if x > y: y = x    print(y) # IndentationError: unexpected indent
if x > y: while y != z: y -= 1  # SyntaxError: invalid syntax

Boş bir blok ile Girinti Hatası alırız. İçeriği olmayan bir bloğumuz olduğunda pass (hiçbir şey yapmayan bir komut) kullanabiliriz:

def will_be_implemented_later():    pass

Python girintilerinde boşluk mu tab (sekme) mı kullanmalıyız?

Kısaca: girinti için her zaman 4 boşluk kullanın.

Tab kullanmak da mümkün olsa da Python stil kılavuzu (PEP 8) boşlukların daha çok tercih edildiğini belirtir.

Python 3’te, girinti için sekme ve boşlukları karıştıramayız. Böyle bir durumda derleme zamanı hatası alırız: Inconsistent use of tabs and spaces in indentation (girintide sekmelerin ve boşlukların tutarsız kullanımı). Bu durumda programımız çalışmaz.

Python 2’de ise girintide sekmeleri ve boşlukları karışık kullanabiliriz. Ama bu da önerilen bir kullanım değildir. Sekme karakteri, önceki girintiyi 8 boşluk olacak şekilde tamamlar. Düzenleyiciler sekmeleri genellikle 4 boşluk olarak gösterdiği için bu durum küçük hatalara neden olabilir.

Python 2 komut satırı yorumlayıcısını -t seçeneğiyle çağırırken, sekmeleri ve boşlukları karıştıran kodlar hakkında uyarılar verir. -tt kullanıldığında bu uyarılar hataya dönüşür. Bu seçenekler şiddetle tavsiye edilir!

PEP 8

Birçok editörde “boşluklara sekme” yapılandırması bulunur. Düzenleyiciyi yapılandırırken, sekme karakteri (“\t”) ve sekme tuşu arasında ayrım yapılmalıdır.

  • Sekme karakteri, en azından (kazara) karışık girintinin mümkün olduğu durumlarda, dil anlambilimiyle eşleşecek biçimde 8 boşluk gösterecek şekilde yapılandırılmalıdır. Editörler ayrıca sekme karakterini otomatik olarak boşluklara dönüştürebilir.
  • Ancak, düzenleyiciyi, Sekme tuşuna basıldığında bir sekme karakteri eklemek yerine 4 boşluk ekleyecek şekilde yapılandırmak yararlı olabilir.

Sekmeler ve boşlukların karışımıyla veya standart olmayan sayıda girinti boşluklarıyla yazılan Python kaynak kodunu uyumlu hale getirilebiliriz. Bunu yapabileceğimiz araçlara bakalım:

Python girinti sorununu nasıl çözebiliriz?

Bir script yazdık ve girinti hatası alıyoruz. Örneğin bu hataların sebebi tab ve boşluk karakterlerinin karışık olarak kullanılması olabilir. Eğer girinti sorununu çözersek kodumuz çalışacak. Python için girinti problemini bizim yerimize çözecek bir araç var mı bakalım – örneğin HTML için bu işi HTML Tidy ile yapabilirdik.

reindent.py

Python kurulumu ile birlikte gelen reindent.py scriptini kullanabiliriz. Bu script Python kurulum klasöründeki Tools/scripts/ klasörü altında bulunur:

Python dosyalarındaki girintileri 4-boşluk girinti haline getirir. Ayrıca satır sonlarındaki fazla boşlukları siler ve boş satırlalrı kaldırır. Bunun yanında son satırın boş bir yeni satır olmasını sağlar.

Scriptin kullanımı için ayrıntılı açıklamalarına bakabilirsiniz.


NOT: Eğer linux sürümünüz içerisindeki Python’da reindent yoksa pip aracılığı ile yükleyebilirsiniz: pip install reindent. Pip’e alternatif olarak başka paket yükleyicileri de kullanılabilir. Ancack hangi paket yöneticisini kullanacağınız linux sürümü ve alışkanlıklarınıza bağlı olacaktır.

autopep8

Başka bir yöntem autopep8 olabilir:

$ # hangi değişikliklerin yapılacağını görelim
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # bu değişiklikleri uygulayalım
$ autopep8 path/to/file.py --select=E101,E121 --in-place

Bunu tüm projenize uygulamak için yinelemeyi açabiliriz:

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

vim ile girintileri düzenleme

Vim kullanıyorsanız :h retab ile girintileri düzenleyebilirsiniz.

                                                        *:ret* *:retab*
:[range]ret[ab][!] [new_tabstop]

Örneğin aşağıdakini yazarsanız:

:ret

Tüm tab karakterleriniz boşluğa dönüştürülür.

:se et

ile tüm satırların tab karakteri kullanması engellenir.


PythonTidy

Eğer HTMLtidy’ye alışkanlığınız varsa PythonTidy‘yi de değerlendirebilirsiniz. PythonTidy tab karakterlerini düzeltmek de dahil bir çok işi yapacaktır.

Fonksiyon içindeki girintiler ve yorumlar

Aşağıdaki gibi bir fonksiyon tanımınız varsa muhtemelen girinti hatası alırsınız:

def arithmetic(A):
    x=1
"""
Yorumlar
"""  
    if x=1:
        x=1
    elif x=2:
        x=2
    return 0

Bu hatanın nedeni ne ve nasıl çözebiliriz bakalım:

Kod içerisindeki  """ xxx """ ifadesi bir docstring‘tir. Her ne kadar yorum olarak kullanılabilir olsa da, aslında, kodun bir parçasıdır ve girintilendirilmesi gerekir:

def arithmetic(A):
    x=1
    """
    Yorumlar
    """  
    if x==1:
        x=1
    elif x==2:
        x=2
    return 0

Eğer tek satırda yorum kullanırsanız (# ile), bu yorumlar kodun bir parçası olmazlar. Dolayısıyla bu yorumların girintilendirilmesini önemsemeyiz.

Peki neden böyle? docstringi aslında yazdığımız kodu kullanıcıya açıklamak için kullanırız . Help fonksiyonunu bir kere bile kullandıysanız docstring’in kullanımını görmüşsünüzdür. Python yardım aracında (help(fonksiyon) çağrısında) gördüğümüz açıklamaları docstring ile oluştururuz.

Dolayısıyla, eğer yorumlarınızda indentation hatası alıyorsanız, docstring’lere girinti uygulayın. Ya da tek satırda yorum kullanın.

Bir yanıt yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top