Python İyileştirme Önerileri (PEPs) ve PEP8 Nedir?

Python İyileştirme Önerileri (Python Enhancement Proposals); Python dilinin resmi tavsiyelerinden, yeni gelen özellikler için dokümanlardan veya yeni özellik tavsiyesi alma gibi değişik içerikler oluşan bir dizi kayıttır. İçerikler dizideki sıralarıyla anılır genelde, en meşhuru PEP8 dokuzuncu sıradadır(Index sıfırdan başladığı için).

Resmi içeriğe şuradan ulaşılabilir. Malum yazılı kurallar olduğu için yorum yapma şansım yok, bu yüzden bu yazı daha çok çeviri/özet havasında olacaktır. Dil sorunu yaşamayan arkadaşların kaynağa bakmaları daha iyi olacaktır.

Bu listenin tamamından ziyade en önemlisi olan ve yeni başlayan ya da usta herkesin dikkat etmesi gereken içerik 8 yani PEP8 üzerinde biraz duralım.

PEP8; Python kod yapısının(boşluklar, girintiler vs.) nasıl olacağı üzerine yazılmış bir içeriktir.

Girintiler

Bildiğiniz gibi Python’da parantez yerine bir Tab karakteri kadar boşluk kullanırız. Yani o girintinin Python yorumlayıcısı için anlamı büyük bu yüzden doğru kullanmamız gereken önemli bir karakter. Burada bazı tavsiyelerde bulunuyor bize PEP8.

İlk kural Tab karakteri yerine 4 boşluk kullanın. Bu gerçekten önemli, kodunuz Tab karakteri 2, 4 ya da 8 karaktere ayarlı bir editörde açıldığında katliam gibi durabilir. Pek çok IDE/Editör Tab karakterini 4 boşluk karakterine çevirerek yazıyor. Tabi burada tab ile başlanmış bir projeye boşluk ile devam etmek zor olacağı için tab ile devam edilmeli. Python 3 tab ve boşluk karışımı kod yorumlamıyor, izin vermiyor. Python 2 ise yorumlarken kullanılabilecek bir opsiyon ile karışık bir durum varsa uyarı verebiliyor.

Fonksiyon parametrelerini, eğer açılış parantezinin olduğu satırı kullandıysak, bir alt satıra kaydırdığımızda fonksiyonu açtığımız parantezden devam etmeliyiz. Kullanmadıysak, devam eden satırlardan ayrılacak şekilde bir girinti daha koymalıyız.

# doğru
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
# Devam eden satırdan ayrılması için fazladan bir girinti daha
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

# Yanlış

# Açılış parantezine hizalanmalıydı
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# Fonksiyon içeriğinden ayrılmalı parametreler
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

Uzun if ifadelerinde ise yine fazladan bir girinti kullanılabilir ya da koşul bitimine bir yorum bırakılıyorsa ayrım kolaylaşacağı için gerek görülmeyebilir.

if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

if (this_is_one_thing
        and that_is_another_thing):
    do_something()

Kapama parantezleri eğer bir alt satıra atılıyorsa, ya parametrelerinin ya da değerlerinin dikey hizasında olacak kadar girdili olmalı ya da satırın ilk karakteri olmalı.

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

Satırdaki maksimum karakter limiti

Bütün satırlar 79 karakter ile limitli olmalı ama geliştirmeyi hızlandıracaksa 80 ya da 100 karakter limiti de uygulanabilir.

Uzun yorum, metin gibi satırlar 72 karakter ile limitlenmeli.

Çok uzun satırlarda; eğer ifade tanımı gibi parantez ile kümele yapılabilecek bir durum varsa parantez kullanılmalı ama metin gibi yada with, assert kullanımı gibi durumlarda ters bölü işareti kullanılabilir.

with open('/path/to/some/file/you/want/to/read') as file_1, \
     open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

Satır atlama operatörden önce mi sonra mı?

Yaygın kullanımın aksine, okumayı ve anlamayı kolaylaştırmak için operatörden önce satır atlamak daha uygun olacaktır.

# Yanlış 
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

# Doğru
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Boş satırlar
Sınıf tanımlarından önce 2 boş satır bırakılmalı.
Method tanımlarından önce 1 boş satır bırakılmalı.

Import kullanımı

İfadeler ayrı satırlarda olmalıdır ve dosyanın en üstünde bulunmalıdır.

# Doğru
import os
import sys

# Yanlış
import sys, os

# Modül üzerinden paket çağırımı için bu kullanım doğrudur
from subprocess import Popen, PIPE

Import’lar şu şekilde gruplanmalıdır.
1 – Standart kütüphaneler
2 – Üçüncü parti kütüphaneler
3 – Local kütüphaneler

Tırnaklar
Tek veya çift tırnak kullanımı için bir öneri yapılmıyor, Python ikisine de aynı davranıyor. Metin içinde ters bölü kullanımı aza indirgeyecek şekilde kullanılabilir.

Boşluk karakteri

Parantezler içinde kullanılmamalı ama virgülden sonra eğer bir değer var ise bir boşluk kullanılmalı. Virgül, iki nokta, noktalı virgül gibi karakterlerden önce kullanılması da uygun değil. Slice’larda kullanılan iki nokta’dan sonra ya da önce boşluk kullanılmamalı.

# Doğru
spam(ham[1], {eggs: 2})
foo = (0,)
if x == 4: print x, y; x, y = y, x
ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
spam(1)

# Yanlış
spam( ham[ 1 ], { eggs: 2 } )
bar = (0, )
if x == 4 : print x , y ; x , y = y , x
ham[1: 9], ham[1 :9], ham[1:9 :3]
spam (1)

Fonksiyonlarda varsayılan ifade tanımlarken eşittirin etrafına boşluk konulmamalıdır.

# Doğru
def complex(real, imag=0.0):
    return magic(r=real, i=imag)

# Yanlış
def complex(real, imag = 0.0):
    return magic(r = real, i = imag)

Yorumlar

Yorumlar, dil bilgisi kurallarına uygun cümlelerden oluşmalı. Kodunuzun ufak bir ihtimal dahi olsa başka kişiler tarafından okunacağını düşünüyorsanız yorumlar, global olması açısından, İngilizce olmalı.

Değişken isimlendirme

İsimlendirme konusunda oturmuş tek bir kural yok, bir kaç standart kullanım var.

b (tek küçük harf)
B (tek büyük harf)
lowercase
lower_case_with_underscores
UPPERCASE
UPPER_CASE_WITH_UNDERSCORES
CapitalizedWords (CamelCase)
mixedCase
Capitalized_Words_With_Underscores

Küçük L harfi, büyük o harfi gibi başka karakterlerle karışacak karakterler tek başına kullanılmamalı.

ASCII uygun karakterler kullanılmalı. ÜĞÇŞİ gibi Türkçe karakterler yok yani.

Modüller tamamı küçük harfler ile ve mümkün olduğunca kısa isimlendirilmeli. Alt çizgi kullanılabilir.

Sınıf isimleri CamelCase formatına uygun isimlendirilmelidir.

Fonksiyon ve metot isimleri, küçük harflerden ve alt çizgi karakterlerinden oluşmalı. Public olmayan metotların başına _ karakteri getirilmeli.

Fonksiyon parametreleri yine küçük harflerden oluşmalı.

Sabit kalacak değişkenler (Constants) büyük harfler ve alt çizgi karakteri ile isimlendirilmelidir.

PEP8 için kısa bir özet oldu bu yazımız. Bütün listeyi görmek isteyenler kaynağa bakabilirler.

https://www.python.org/dev/peps/pep-0008/


Yayımlandı

kategorisi

yazarı:

Etiketler:

Yorumlar

Bir cevap yazın

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