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, 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
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.
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.
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.
Python için kullanılan PEP8 Kuralları yada PEP8 standartları nelerdir bir bakalım. Devamında ayrıntılara girebiliriz.
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',
)
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.
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.
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)
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.
İ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.
Her import grubu arasında bir boşluk koymalıyız.
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
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.
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.
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
Aşağıdaki ikili operatörlerin hepsinde her iki tarafında bir boşluk olacak şekilde çevrelememiz gerekli
! 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)
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,)
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ı genellikle bir çok cümlecikten oluşan bir veya daha fazla satırdan oluşmaktadır. Blok yorumlarda uymamız gereken kurallar;
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ç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;
Ö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'
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.
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.
! 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.
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 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 isimlerini belirlerken de ‘CapWords’ standardı kullanılmalıdır.
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ında normal fonksiyon isimlendirme kurallarını kullanmalıyız. Yine okunabilirliği artırmak adına alt çizgi kullanımı uygun görülebilir.
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)
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!
Gerçekten çok faydalı ve kapsamlı olmuş, teşekkürler Birhan.
Import işlemleri için bile sıralama kuralı varmış. Güzel bi rehber olmuş dostum, tebrikler
Ellerine sağlık güzel yazı olmuş
Gerçekten çok güzel olmuş ama TRQ klavyede ` işareti nasıl yapılıyor?
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.
Furkan İ.
25-10-2019Ellerine sağlık, çok yararlı olmuş.
BİRHAN K.
Teşekkürler.