PEP8 Nedir? Python Stil Rehberi ve PEP-8 Standartları

Bu makalede Python için PEP8 nedir? PEP-8 kuralları nelerdir? Python yazım kuralları nelerdir? Nasıl daha iyi python yazabiliriz gibi sorulara cevap bulacağız. 

PEP-8, Python için stil rehberi diye tanımlanan ve tüm PEP8 kurallarının bulunduğu dokümantasyonun çevirisi niteliğinden olan bu makalenin sonunda;
PEP 8 uyumlu python kodu nedir? nasıl daha iyi python yazarız? neden pep8 kurallarına veya standartlarına uymalıyız? gibi soruların cevaplarını öğrenmiş olacağız.

NOT: Aradığınızı hemen bulmak istiyorsanız lütfen baştaki içindekiler bölümünü kullanın.

PEP8 Nedir?

Pep8, python kodunun nasıl yazılacağını dair ipuçları ve ilkeleri barındıran, 2001 yılında Guido van Rossum, Barry Warsaw ve Nick Coghlan tarafından yazılan belgedir.

Bu belgenin temel amacı python kodunun tutarlılığını ve okunabilirliğini arttırmaktır. Açılımı: (‘Python Enhancement Proposal’) Python Geliştirme Önerileri yada Python İyileştirme Önerileri

Neden PEP8 Kurallarına Uymalıyız?

Her programlama dili için standart olan ve yazılan kodun anlaşılır olması için çoğu programcı tarafından kabul gören yazım kuralları vardır. Bu yazım kuralları Python için çok daha önemlidir çünkü diğer programlama dillerinden daha farklı bir sözdizimine (syntax) sahiptir.

 Geliştirilen büyük ve arkasında birden fazla geliştiricinin olduğu projelerde, projenin sağlıklı ve hızlı ilerlemesi için öncelikle yazılan kodun anlaşılır ve okunabilir olması gerekir.

Anlaşılır ve okunabilir bir Python kodu için uymamız gereken kurallar, pep8 adı altında karşımıza çıkıyor. Her bakımdan sağlıklı bir proje yürütmek istiyorsak PEP 8 kurallarına uygun şekilde ilerlemeliyiz.

Zaten profesyonel bir geliştirme ortamında isek bu kuralları göz ardı etmemeliyiz. Küçük çaplı ve arkasında sadece sizin olduğunuz Python projelerinizde bile pep8 kurallarına olabildiğince uymaya çalışmalıyız.

Okunabilir Kod (Okunabilirlik) Neden Bu Kadar Önemli

PEP 8, python kodunun okunabilirliğini artırmak için var olduğunu biliyoruz. Fakat okunabilirlik neden bu kadar önemli?

 Guido van Rossum der ki “Code is read much more often than it is written.”  Yani kod, yazıldığından daha çok, daha sık okunur.

Örnek olarak bir kullanıcı kaydı ve giriş işlemi için belki birkaç saatimizi kod yazarak geçireceğiz ama sonrasında bir daha o işlem için ek bir yazma işlemi yapmayacağız. Ancak yazdığımız kodu kesinlikle tekrar okumak zorunda kalacağız yada başka birisi kalacak.

O kod parçasına uzun bir süre sonra bile baktığımızda hangi fonksiyonun ne işe yaradığını yada belli bir bölümü neden yazdığımızı hatırlamamız gerekir.

Bu yüzden Python için olsun veya olmasın, farklı bir programlama dili kullanıyor olsak bile kullanılan dilin standartlarına uymamız gerekir.

PEP8 Kurallarını Ne Zaman Yok Sayabiliriz

Pep-8 içerisindeki bazı kurallar aşağıdaki durumlar için yok sayılabilir.
•    PEP 8`e uymak mevcut yazılımla uyumluluğu bozarsa.
•    Üzerinde çalıştığımız projeyi kapsayan kod PEP8 ile tutarsızsa.
•    Projenin daha eski python sürümleri ile uyumlu kalması gerekiyorsa.

PEP-8 Kuralları Nelerdir

Python için kullanılan PEP8 Kuralları yada PEP8 standartları nelerdir bir bakalım. Devamında ayrıntılara girebiliriz.

  • Girintileme işlemleri
  • Çıkıntı veya boşluk kullanımları ('tab' ve 'space')
  • Satır Uzunlukları
  • İkili operatörlerin kullanımı ile satır ilişkisi
  • Boş satırların kullanımı
  • Doğru 'import' etme şekilleri
  • Tırnak işareti kullanımı
  • İfadeler arasındaki boşluk kullanımları
  • Kaçış virgüllerinin doğru kullanımı
  • Yorum satırlarının doğru kullanımı
  • Adlandırma kuralları ve stilleri
  • Kullanılmaması gereken karakterler
  • Paket ve modül isimlendirmeleri
  • Sınıf isimlendirme kuralları
  • Değişken isimlendirme kuralları
PEP-8 Python Stil Rehberi
PEP8 Nedir? - Python Stil Rehberi - PEP 8 Kuralları

PEP 8 Python Kodu İçin Stil Rehberi

Kod Düzeni (Code Layout)

Girinti (Indentation)

Her girinti (tab) için 4 boşluk kullanmalıyız. 'Tab' karakteri çoğu editörde varsayılan olarak 4 boşluk karakterine denk olduğu için 'space' tuşu yerine 'tab' tuşunu kullanırız. Girinti için kullanılan boşluk karakterini standartlaştırmalıyız.

Kodumuzda 2, 3 veya 4 boşluk karakterleri karışık bir şekilde farklı yerlede bulunuyorsa farklı python sürümleri için yorumlama hataları ve uyarılarla karşılaşabiliriz.
Fonksiyonların aldığı argümanlar için girinti kullanımında aşağıdaki gibi düzen belirlemeliyiz.

DOĞRU KULLANIM

# açılış parantezinin konumuna göre hizalanmış
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# Argümanları sonraki ifadeden ayırmak için 4 boşluk (fazladan giriniti) ekleyin 
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

# Alt satıra asılmış argümanlar için bir seviye girinti eklenmelidir.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

YANLIŞ KULLANIM

# Dikey hizalama kullanılmadığında ki argüman görünümü
foo = long_function_name(var_one, var_two,
    var_three, var_four)

def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

Eğer birden çok argüman alan fonksiyonlarımız varsa ilk satırda hiçbir argüman olmamalı.

Eğer argümanları girinti ile fonksiyon içerisindeki işlemlerden ayırabiliyorsak ilk satırda da argüman olabilir ancak bunun dışında argüman hizalama şekli aşağıdaki gibi olmalıdır.

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

Bir koşullu ifadenin koşullu kısmı birden fazla satıra yazılmasını gerektirecek kadar uzun olduğunda aşağıdaki gibi yazılması gerekir.

# Fazladan girinti yok
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Editörlere göre ayrım sağlayabilecek yorumlar eklenebilir
if (this_is_one_thing and
    that_is_another_thing):
    # Her iki koşulda doğru olduğunda işlem yapabiliriz
    do_something()

# Koşul içeren devam satırına fazladan girinti ekleyebiliriz
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

Çok satırlı yapılarda (bir çok argüman alan fonksiyonlarda, dizilerde veya sözlüklerde) aşağıdaki gibi bir PEP 8 kuralı benimsenmiştir.

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

# YA DA

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

Sekmeler (Çıkıntılar) Veya Boşluklar (Tabs or Spaces)

Tercih edilen girinti yöntemi boşluklardır. Sekmeler (tablar) yalnızca sekmeler ile oluşmuş yapıda tutarlılık sağlamak için kullanılmalıdır.

Maksimum Satır Uzunluğu (Maximum Line Length)

Tüm satırlar maksimum 79 karakter olmalıdır. Daha az kısıtlamaya sahip olan ‘yorum satırları’ gibi satırlar 72 karakter ile sınırlandırılmalıdır.

Bu iki kuralın birden fazla nedeni bulunmakta ancak en önemlisi, kullanılan editörde daha okunaklı bir kod parçacıkları oluşturmaktır.

Bu sınırlamaya uymak için kullandığımız herhangi bir editörün ayarlarından, her satırın maksimum kaç karakterden oluşacağını ayarlayabiliriz.

Alt Satıra İkili Operatörden Önce mi Sonra mı Geçmeli? (Should a Line Break Before or After a Binary Operator?)

 Orijinal belgede yazılana göre ikili operatörden sonra alt satıra geçmek uzun zamandır önerilen bir stil imiş. Ancak bu durumun zaman içinde kodun okunabilirliğine zarar verdiğini fark etmişler.

Sonuç olarak ikili operatörler, ekran yapısına göre farklı sütunlara taşınabilmekte olduğu için hangi öğelerin eklendiğini yada hangi öğelerin çıkartıldığını anlamak için ayrı bir efor sarf etmemize neden olmakta.

Bu okunabilirlik probleminin önüne geçmek için aşağıdaki doğru ve yanlış kullanımlara bakın.

YANLIŞ KULLANIM

income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

DOĞRU KULLANIM

income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

Boş Satırlar (Blank Lines)

Dikey boşluklar veya boş satırlar yazdığımız kodun okunabilirliğini büyük ölçüde arttırabilir. Öyle ki bir araya toplanan kod, birbirinden ayırt etmeyi ve okunmayı zorlaştırabilir.

Tam tersi şekilde fazla kullanılan boş satırlar kodun seyrek görünmesine ve kodu okuyacak kişinin fazladan kaydırma yapmasına neden olabilir. 

Bu nedenle üst düzey işlevleri ve sınıfları iki boş satırla aşağıdaki gibi çevrelememiz en ideal kullanıma örnektir. 

class MyFirstClass:
    pass


class MySecondClass:
    pass


def top_level_function():
    return None

Sınıf içerisindeki metotları ise birbirleriyle üst düzey işlevlere göre daha çok ilgili oldukları için birer satırla çevrelemek en uygun kullanım şekline örnektir.

class MyClass:
    def first_method(self):
        return None

    def second_method(self):
        return None

Dikey boşlukları dikkatli bir şekilde kullanırsak okunabilirliği büyük ölçüde arttırabildiğimiz gibi okuyucunun kodun bölümleri arasında nasıl bir ilişki olduğunu daha kolay kavramasına yardımcı olmuş oluruz.

Dahil Etme (İmport)

İmport işlemi çoğunlukla ayrı satırlarda yapılmalıdır.

Yes: import os
     import sys

No:  import sys, os

# BU KULLANIM DA UYGUNDUR

from subprocess import Popen, PIPE

! Dahil etme işlemi her zaman dosyanın başında tanımlanmalıdır. Ayrıca ‘import’ işlemleri aşağıdaki sırayla gruplandırılarak yapılmalıdır.

  • Standart kütüphaneleri dahil etme işlemi
  • İlgili üçüncü partileri dahil etme işlemi
  • Yerel uygulamalara veya kütüphanelere özel ‘import’ işlemleri.

 Her import grubu arasında bir boşluk koymalıyız.

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

Tırnak İşareti (String Quotes)

 Python`da çift tırnak ve tek tırnak arasında bir fark yoktur. İkisi de aynı işlevi gördüğünden PEP 8 dahilinde herhangi bir öneri yoktur.

Ancak bir ifade hem çift hem de tek tırnak işaretini içerebildiğinde, ters eğik çizgiye (backslashes) gerek kalmayacak şekilde olan kullanım, okunabilirliği arttırdığından tercih edilmelidir.

İfadeler Arasındaki Boşluklar (Whitespace in Expressions and Statements)

Python`da boşluk, doğru kullanıldığında ifadeler arasındaki ilgiyi veya farklılığı daha kolay anlamamıza yardımcı olur.

Doğru sayıda kullanılan boşluk, kodu görsel olarak birleştirmemize kolaylık sağlar.

Pet Peeves

 Parantez, köşeli parantez veya süslü parantez için doğru ve yanlış kullanım şekli aşağıdaki gibidir.

# Doğru
spam(ham[1], {eggs: 2})

# Yanlış
spam( ham[ 1 ], { eggs: 2 } )

 Virgül ve onu takip eden parantez arasındaki boşluklar aşağıdaki gibi olmalıdır.

# Doğru
foo = (0,)

# Yanlış
bar = (0, )

 Virgül, noktalı vürgül ve iki nokta üst üste işaretlerinden hemen önce ki boşluk kullanımı aşağıdaki gibi olmalıdır.

# Doğru
if x == 4: print x, y; x, y = y, x

# Yanlış
if x == 4 : print x , y ; x , y = y , x

 Bir fonksiyonun argümanlarını içeren parantezden hemen önceki boşluk kullanımı aşağıdaki gibi olmalıdır.

# Doğru
spam(1)

# Yanlış
spam (1)

 Liste veya sözlük gibi ifadelerin indeksleme işlemlerinde kullanılan parantezlerden hemen önce boşluk kullanımı aşağıdaki gibi olmalıdır.

# Doğru
dct['key'] = lst[index]

# Yanlış
dct ['key'] = lst [index]

 Diğer değişken isimleri veya değerleri ile hizalamak adına boşluk kullanma durumu aşağıdaki gibi olmalıdır.

DOĞRU KULLANIM

x = 1
y = 2
long_variable = 3

YANLIŞ KULLANIM

x             = 1
y             = 2
long_variable = 3

Boşluk Kullanımı İçin Diğer Tavsiyeler

Aşağıdaki ikili operatörlerin hepsinde her iki tarafında bir boşluk olacak şekilde çevrelememiz gerekli

  • Atama operatörü (=)
  • Arttırma – azaltma, atama operatörü (+= , -= gibi)
  • Karşılaştırma operatörleri (==, <, >, !=, <>, <=, >=, in, not in, is, is not)
  • Booleans operatörler (and, or, not gibi)

! Hiçbir zaman bir operatörün etrafında birden fazla boşluk kullanılmamalı ve her iki tarafında da aynı sayıda boşluk bulunmalı.

DOĞRU KULLANIM

i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

YANLIŞ KULLANIM

i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

Kaçış Virgüllerinin Kullanımı (When to Use Trailing Commas)

Pep8 kurallarına göre kaçış virgüllerinin kullanımı isteğe bağlı, opsiyoneldir. Ancak yanlış kullanılmaması adına aşağıdaki gibi bir kullanım daha doğru olur.

# kafa karıştırıcı
FILES = 'setup.cfg',

# daha iyi
FILES = ('setup.cfg',)

DOĞRU KULLANIM

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

YANLIŞ KULLANIM

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

Yorumlar (Comments)

 Pep-8 dokümantasyonunda yazılana göre herhangi bir kodla çelişen yorum, hiç yorum yazmamaktan daha kötüdür.

* O nedenle herhangi bir kodda yapılan değişiklikle beraber yorumları da güncellememiz gerekir.

! Kodla alakalı yapılan yorumlar tam ve net cümlelerden oluşmalıdır. Ayrıca yapılan yorum, değişken ismi gibi bir tanımlayıcı ile başlamıyorsa kesinlikle büyük harfle başlamalıdır.

Blok Yorumlar (Block Comments)

Blok yorumları genellikle bir çok cümlecikten oluşan bir veya daha fazla satırdan oluşmaktadır. Blok yorumlarda uymamız gereken kurallar;

  • Yorumları, tanımladıkları kodla aynı seviyeye getirin.
  • Her satıra ‘#’ işareti ile başlayıp ardından bir boşluk bırakın.
  • Paragrafları tek bir ‘#’ işareti içeren satırlara ayırın.
for i in range(0, 60):
    # Döngü toplam 60 kere tekrar edecek ve her tekrarda i değerini ekrana yazacak
    # her tekrarda yeni bir satıra geçecek
    print(i, '\n')

 Ayrıca ana dili İngilizce olmayan Python programcıların yorumlar için kullanacağı dil, global seviyede anlaşılır olması için İngilizce olmalıdır.

Satır İçi Yorumlar (Inline Comments)

* Satır içi yorumlar bir kod parçasındaki tek bir ifadeyi açıklar. O ifadenin neden gerekli olduğunu anlamamızı sağlar. Satır içi yorumları için belirlenen kurallar;

  • Satır içi yorumlar dikkatli kullanılmalıdır
  • Yapılacak yorum, yorumla alakalı ifadeden en az iki boşlukla ayrılmalıdır.
  • ‘#’ işareti ile başlamalıdır. ‘#’ işaretinin her iki tarafında birer boşluk olmalıdır.
  • Satır içi yorumlar tanımladıkları ifadeyle aynı satırda olmalıdır. 

Örnek

x = 5  # Bu bir satır içi yorumdur

Bazı satır için yorumlar gereksizdir. Aşağıdaki gösterildiği satır içi yorumları gereksiz yere kullanmamalıyız.

# Gereksiz bir kullanım
x = 'John Smith'  # Student Name

# Yerine değişken ismi daha alakalı yapılabilir
student_name = 'John Smith'

Adlandırma Kuralları (Naming Conventions)

Pep-8 ortamına göre adlandırma işlemi için geçerli, tutarlı ve kesinlik sağlayan kurallar biraz dağınıktır. Peki bu ne anlama geliyor?

 Şöyle ki yeni geliştireceğiniz modül veya paketlerde PEP8 standartlarına uymalıyız ancak halihazırda mevcut bir projenin veya kütüphanenin farklı bir tarzı varsa o projeye ait iç tutarlılık için PEP8 standartları göz ardı edilebilir.

 Pep8`e göre isimlendirme için kesin ve oturmuş olan tek bir adlandırma stili yoktur. Bunun yerine birden fazla standartlaşmış adlandırma stili vardır. Aşağıdaki stiller bunlara örnek olarak verilebilir.

  • b (tek küçük harf kullanımı)
  • B (tek büyük harf kullanımı)
  • lowercase
  • lower_case
  • UPPERCASE
  • UPPER_CASE
  • CapitalizedWords (‘CapWords’ veya ‘CamelCase’ olarak da bilinir. Bazen ‘StudlyCaps olarak da adlandırılır)
  • mixedCase (CapitalizedWords’ den farkı ilk harfin de küçük olmasıdır.)
  • Capitalized_Under (Bu stilin kullanımı pek önerilmez)

Birbiriyle alakalı isimleri bir önek ile gruplama stili de vardır.

Örnek olarak ‘Os.stat’ fonksiyonu içerisinde ‘st_mode’, ‘st_size’, ‘st_mtim’ gibi önek ile isimlendirilmiş değişkenler kullanılabilir.

Kaçınılması Gereken İsimler (Names to Avoid)

! Asla tek kelimelik değişken isimlerinde küçük ‘l’ (Lüleburgaz), büyük ‘O’ (Osmaniye) veya büyük ‘I’ (Iğdır) kullanmamalıyız. Bazı fontlarda bu harfler 1 ve 0 rakamlarından ayırt edilemez.

Paket ve Modül İsimleri (Package and Module Names)

 Modül ve paket isimlerinin tamamı küçük harf olmalıdır. Alt çizgi kullanımı önerilmese de okunabilirliği arttırmak adına paket ve modül isimlerinde alt çizgi kullanılabilir.

Sınıf İsimleri (Class Names)

 Sınıf isimleri için ‘CapWords’ standardı kullanılmalıdır. Bu isimlere büyük harfle başlamakla beraber her yeni kelime arasında alt çizgi yerine bitişik bir şekilde büyük harf kullanılmalıdır.

Tür Değişken İsimleri (Type Variable Names)

 Tür değişken isimlerini belirlerken de ‘CapWords’ standardı kullanılmalıdır.

Fonksiyon ve Değişken İsimleri (Function and Variable Names)

 Fonksiyon isimleri daima küçük harfler kullanılmalıdır. Okunabilirliği arttırmak adına kelimeler arasında alt çizgi kullanılabilir. Değişken isimleri de fonksiyon isimlerinde kullanılan kurallara göre yazılmalıdır.

Sınıf Fonksiyonları (Method Names)

 Sınıf fonksiyonlarında normal fonksiyon isimlendirme kurallarını kullanmalıyız. Yine okunabilirliği artırmak adına alt çizgi kullanımı uygun görülebilir.

Sabitler (Constants)

 Sabit tanımları yaparken sadece büyük harf kullanılmalıdır ver kelimeleri birbirinden ayırmak için alt çizgi kullanılmalıdır. (ORNEK_SABIT_TANIMI)

SONUÇ

Pep8 kurallarını öğrendiğimize göre artık python kodlarımızı pep8 standartlarına göre kodlayıp daha iyi bir python seviyesine erişebileceğiz. Yazdığınız kodun pep8 standartlarına uygunluğunu pep8online adresinden kontrol edebilirsiniz.

Bu makale zaman geçtikçe güncellenecektir. Eğer makalede eksik ya da yanlış olduğunu düşündüğünüz bir bölüm varsa yorum kısmında belirtebilirsiniz. İyi pitonlamalar! 

Web geliştirme, programlama ve teknolojik gelişmeler ile yakından ilgilenen olabildiğine meraklı bir insan. Bendeniz Birhan Karahasan.

6 YORUM

Birhan Karahasan

Furkan İ.

25-10-2019

Ellerine sağlık, çok yararlı olmuş.

Teşekkürler.

Birhan Karahasan

Burak y.

28-02-2020

Gerçekten çok faydalı ve kapsamlı olmuş, teşekkürler Birhan.

Ben teşekkür ederim, güzel mesajınız için.

Birhan Karahasan

ensar173

19-08-2020

Import işlemleri için bile sıralama kuralı varmış. Güzel bi rehber olmuş dostum, tebrikler

Teşekkürler

Birhan Karahasan

Abdulkadir

02-09-2020

Ellerine sağlık güzel yazı olmuş

Sağolun, teşekkürler.

Birhan Karahasan

kreyto

11-10-2020

Gerçekten çok güzel olmuş ama TRQ klavyede ` işareti nasıl yapılıyor?

Teşekkürler, ` işaretini Alt Gr + ,(virgül) ile yapabilirsin.

Birhan Karahasan

İrfan

15-12-2020

Editörde pep8'e göre otomatik tamamlayıcı olmasına rağmen arada gelip bakıyorum buraya. Öğretici ve ayrıntılı olmuş gerçekten, teşekkürler.

Sağolun, ben teşekkür ederim.

Yorum Yap Veya Soru Sor

EN ÖNEMLİ YERİ BOŞ BIRAKMAYINIZ (MİN. 5 KARAKTER)
Gerekli
LÜTFEN GEÇERLİ BİR E-POSTA ADRESİ GİRİNİZ

E-Posta Bülteni