← Blog · · ConvertCaseHQ Ekibi · 6 dk okuma

Python PEP 8 adlandırma kuralları: değişken ve fonksiyonlarda snake_case

PEP 8'e göre fonksiyon ve değişken adları küçük harfle yazılmalı, sözcükler okunabilirlik gerektirdikçe alt çizgiyle ayrılmalıdır. Buna snake_case denir: total_price, send_invoice(). Sınıflar CapWords (InvoiceSender) kullanır, sabitler alt çizgili büyük harflerle (MAX_RETRIES) yazılır, modüllere ise kısa ve tamamı küçük harfli adlar verilir. Yazacağınız Python kodunun büyük kısmı bundan ibaret.

PEP 8'in adlandırma bölümünün geri kalanı, işe yarar ayrıntıların bulunduğu yerdir: baştaki ve sondaki alt çizgilerin anlamı, kısaltmaların nasıl ele alınacağı, hangi tek harflerden kaçınılacağı ve kuralları çiğnemenin ne zaman doğru olduğu. Aşağıdaki her şey PEP 8'in kendisiyle karşılaştırılarak doğrulandı ve tırnak içindeki her ifade PEP 8'in kendi sözleridir.

Bir bakışta PEP 8 adlandırma kuralları

Neyi adlandırıyorsunuz?PEP 8 stiliÖrnek
ModülKısa, tamamı küçük harf; işe yarıyorsa alt çizgibilling.py, tax_rules.py
PaketKısa, tamamı küçük harf; alt çizgi önerilmezpayments
SınıfCapWordsInvoiceSender
İstisna (exception)CapWords; bir hataysa Error ile biterPaymentDeclinedError
Fonksiyon, metotsnake_casesend_invoice()
Değişken, örnek değişkeni (instance variable)snake_casetotal_price
Metodun ilk argümanıself; sınıf metotlarında clsdef from_settings(cls, settings)
SabitAlt çizgili büyük harfler, genellikle modül düzeyindeMAX_RETRIES
Tür değişkeni (type variable)Kısa CapWordsT, AnyStr
Herkese açık olmayan adBaştaki tek alt çizgi_rate_cache

Tablonun çoğu tek bir küçük modülde şöyle görünür:

# billing.py
MAX_RETRIES = 3
_rate_cache = {}


class PaymentDeclinedError(Exception):
    pass


class InvoiceSender:
    def __init__(self, smtp_host):
        self.smtp_host = smtp_host
        self._attempts = 0

    def send_invoice(self, invoice_id):
        self._attempts += 1
        ...

    @classmethod
    def from_settings(cls, settings):
        return cls(settings["smtp_host"])

Daha seyrek iki satırı da bilmekte yarar var. Tür değişkenleri, kovaryansı ya da kontravaryansı belirtmek için _co veya _contra son ekini alabilir; VT_co = TypeVar('VT_co', covariant=True) örneğindeki gibi. Global değişkenler de fonksiyon kurallarını izler; bir modül from module import * ile kullanılacaksa PEP 8, herkese açık adlarının __all__ içinde listelenmesini önerir.

Neden snake_case?

PEP 8 Temmuz 2001 tarihlidir ve yazarları Guido van Rossum, Barry Warsaw ve Alyssa Coghlan olarak listelenir. Çıkış noktası Guido'nun bir gözlemidir: kod, yazıldığından çok daha sık okunur. Adlandırma kuralları bu amaca hizmet eder. Alt çizgiler, uzun adlarda bile (days_since_last_login) sözcük sınırlarını görünür tutar; snake_case değerlerle CapWords sınıflar arasındaki ayrım ise bir adın ne tür bir şey olduğunu daha onu aramadan söyler. PEP 8 ayrıca herkese açık API'ler için üstün bir ilke koyar: adlar bir şeyin nasıl uygulandığını değil, nasıl kullanıldığını yansıtmalıdır.

Alt çizgiler ne anlama gelir?

Python'da private anahtar sözcüğü yoktur; bu işi gelenek olarak alt çizgiler görür. PEP 8 dört biçimi tanır:

  • _single_leading: zayıf bir “internal use” (dahili kullanım) göstergesi. from module import * bu adları atlar, ama başka hiçbir şey kimsenin onları kullanmasını engellemez.
  • single_trailing_: bir anahtar sözcükle çakışmayı önler. class_, clss'den iyidir; yine de PEP 8, bir eş anlamlının daha da iyi olabileceğini not eder.
  • __double_leading: bir sınıfın içinde ad bozmayı (name mangling) tetikler. PEP 8 bunu yalnızca alt sınıflardaki özniteliklerle çakışmayı önlemek için önerir ve bazı insanların bundan hoşlanmadığını kabul eder.
  • __double_leading_and_trailing__: __init__ ve __file__ gibi “magic” adlar. PEP 8 bunları asla kendiniz uydurmamanızı, yalnızca belgelenmiş olanları kullanmanızı söyler.

Ad bozma, onu gizlilik sanan insanları şaşırtır. Bu bir yeniden adlandırmadır, kilit değil:

class Account:
    def __init__(self):
        self.__pin = "1234"

acct = Account()
acct.__pin            # AttributeError
acct._Account__pin    # "1234": the mangled name still works

Sabitler bir gelenektir, kural değil

Bir adı büyük harflerle yazmak, kimsenin onu yeniden atamasını engellemez; Python MAX_RETRIES = 4 satırını seve seve çalıştırır. Bir aracın bunu zorunlu kılmasını istiyorsanız adı typing.Final ile işaretleyin:

from typing import Final

MAX_RETRIES: Final = 3
MAX_RETRIES = 4  # still runs, but mypy reports:
                 # Cannot assign to final name "MAX_RETRIES"

Enum üyeleri, büyük harflerin görüldüğü öbür yerdir. Python belgelerindeki enum HOWTO'su, kısmen enum'lar sabitleri temsil ettiği için, kısmen de metot adlarıyla çakışmayı önlemek için UPPER_CASE üye adlarını şiddetle önerir: üyeleri RED ve GREEN olan class Color(Enum) gibi.

Kısaltmalar, tek harfler ve diğer sınır durumlar

Sınıf adlarında kısaltmalar

PEP 8, CapWords içinde bir kısaltmanın her harfinin büyük yazılmasını söyler; yani HTTPServerError, HttpServerError'dan iyidir. Standart kütüphane bunu http.server.HTTPServer ve json.JSONDecodeError gibi yerlerde izler. snake_case'te ise kısaltmalar basitçe küçük harfe döner: parse_json, http_status.

Bir araçla yeniden adlandırıyorsanız bu önemlidir. Büyük/küçük harf dönüştürücümüz processOrder adını process_order'a, HTTPServerError adını http_server_error'a çevirir; bu da snake_case için tam olarak doğrudur. Ama PascalCase çıktısı kısaltmaları sözcük gibi yazar; yani HTTP server error girdisi HttpServerError olarak çıkar ve büyük harfleri PEP 8'e uydurmak için elle düzeltirsiniz.

Kaçınılacak harfler

l (küçük L), O (büyük O) ya da I (İngilizce “i” harfinin büyüğü) harflerini tek karakterli ad olarak asla kullanmayın. Bazı yazı tiplerinde bunlar 1 ve 0 ile ayırt edilemez.

mixedCase

camelCase fonksiyon adlarına yalnızca geriye dönük uyumluluk için, o stilin zaten baskın olduğu yerlerde izin verilir. PEP 8'in kendi örneği threading modülüdür.

Standart kütüphane neden kendi kurallarını çiğniyor?

PEP 8, Python kütüphanesindeki adlandırmanın “a bit of a mess” olduğunu kabul eder (biraz karışık). logging.getLogger() ve unittest'in assertEqual() metoduyla mixedCase adlara, datetime.datetime gibi küçük harfli sınıflara rastlarsınız. list ve dict gibi yerleşik türler bilerek küçük harflidir: PEP 8 yerleşik öğeler için ayrı bir gelenek tanımlar; CapWords yalnızca istisna adlarında ve yerleşik sabitlerde kullanılır.

PEP 8'den iki kural, bu adların neden çoğunlukla olduğu gibi kaldığını açıklar. Birincisi, mevcut bir kütüphane farklı bir stil kullanıyorsa iç tutarlılık tercih edilir. İkincisi, “A Foolish Consistency is the Hobgoblin of Little Minds” (budalaca tutarlılık, küçük zihinlerin korkuluğudur) başlıklı bölüm: PEP 8 ile tutarlılık önemlidir, bir proje içindeki tutarlılık daha önemlidir, bir modül ya da fonksiyon içindeki tutarlılık ise en önemlisidir. Yalnızca uymak uğruna geriye dönük uyumluluğu bozmayın. Bir unittest test sınıfının hâlâ setUp() tanımlamasının nedeni budur: çerçeve tam olarak bu adı çağırır.

Adları Ruff ya da pep8-naming ile otomatik denetleyin

Adları gözle incelemenize gerek yok. flake8 eklentisi pep8-naming bunları denetler; Ruff da aynı denetimleri N kuralları olarak uygular. Şu dosya verildiğinde:

maxRetries = 3


class order_processor:
    def processOrder(self, orderId):
        totalPrice = 0
        return totalPrice


class InvalidOrder(Exception):
    pass

Ruff, içindeki her adı işaretler:

$ ruff check --select N --output-format concise orders.py
orders.py:1:1: N816 Variable `maxRetries` in global scope should not be mixedCase
orders.py:4:7: N801 Class name `order_processor` should use CapWords convention
orders.py:5:9: N802 Function name `processOrder` should be lowercase
orders.py:5:28: N803 Argument name `orderId` should be lowercase
orders.py:6:9: N806 Variable `totalPrice` in function should be lowercase
orders.py:10:7: N818 Exception name `InvalidOrder` should be named with an Error suffix
Found 6 errors.

Kuralları tüm proje için açmak istiyorsanız pyproject.toml dosyasına ekleyin:

[tool.ruff.lint]
extend-select = ["N"]

Yapıştırdığınız bir dosyada tek bir tanımlayıcıyı yeniden adlandırırken Bul ve değiştir aracımız kaç eşleşmeyi değiştirdiğini gösterir; sonucu geri yapıştırmadan önce bu hızlı bir sağlama olur. Kod tabanının tamamı için bunun yerine düzenleyicinizin yeniden adlandırma (rename refactoring) özelliğini kullanın; böylece başka dosyalardaki başvurular da onu izler.

PEP 8 adlandırma kontrol listesi

  • Fonksiyonlar, metotlar, değişkenler ve argümanlar için snake_case.
  • Sınıflar için CapWords; kısaltmalar büyük harfle, istisnalarda Error son ekiyle.
  • Modül düzeyindeki sabitler için alt çizgili büyük harfler; bir denetleyicinin bunları zorunlu kılmasını istiyorsanız ayrıca Final.
  • Kısa, küçük harfli modül adları; paket adlarında alt çizgiden kaçının.
  • Dahili adlar için baştaki tek alt çizgi; çift alt çizgi yalnızca alt sınıf çakışmalarını önlemek için.
  • Mevcut bir kütüphane başka bir stil kullanıyorsa kütüphaneye uyun.

Diller arasında mı geçiş yapıyorsunuz? Geliştirici başvuru rehberimiz Python'un kurallarını JavaScript, Java, Go, Rust ve diğerleriyle yan yana koyuyor.

© 2026 ConvertCaseHQ. Tüm hakları saklıdır.