Logo
Ana Sayfa
ÖZEL KODLAMA DERSLERİ
Yazılım Özel Ders
Tüm birebir programlara genel bakış
Python Yazılım Kursu
Sıfırdan ileri seviyeye birebir Python
Java Yazılım Kursu
OOP odaklı birebir Java eğitimi
AP Computer Science Principles
AP CSP sınav hazırlığı
GRUP DERSLERİ
Python & Django Masterclass
SINIRLI KONTENJAN
Java & Spring Boot Masterclass
SINIRLI KONTENJAN
C# .NET Masterclass
SINIRLI KONTENJAN
VİDEO DERSLER
Sıfırdan Temel Python Kursu
Kendi Hızında Öğren
ÜCRETSİZ
Seviye Testi
Ücretsiz — Python, Java, algoritma seviye testleri
Kariyerini Keşfet
Sertifika Doğrula
Belge numarası ve soyad ile doğrulama

Python'da Type Hint Kullanımı ve mypy ile Statik Kontrol Mantığı

Yazar: Berk Keskin 28.08.2026 ~11 dk okuma 3 Okunma
python-type-hint-mypy-statik-kontrol

Python type hint, bir değişkenin, fonksiyon parametresinin veya dönüş değerinin hangi veri tipini taşıması gerektiğini kod içinde açıkça belirtmenizi sağlayan bir yazım biçimidir. Python'u çalışma zamanında hiçbir şekilde zorlamaz; yalnızca geliştirme sürecinde kodun okunabilirliğini artırır ve mypy gibi statik analiz araçlarıyla birlikte kullanıldığında tip uyuşmazlığı hatalarını kod çalışmadan önce yakalamanıza olanak tanır. Bu yazıda type hint'in temel sözdizimini, Optional kullanımını ve mypy ile statik kontrolün pratikte nasıl işlediğini adım adım göreceksiniz.

Python'da Type Hint Nedir ve Neden Kullanılır?

Type hint, bir fonksiyonun veya değişkenin hangi tipte veri beklediğini kod üzerinde açıkça yazmanızı sağlayan bir ek katmandır. Örneğin bir fonksiyonun int aldığını ve str döndürdüğünü belirtmek, o fonksiyonu kullanan başka bir geliştiricinin (ya da birkaç ay sonraki halinizin) kodu okumadan ne beklemesi gerektiğini anlamasını sağlar. Bu bilgi tamamen isteğe bağlıdır ve Python yorumlayıcısı tarafından zorunlu tutulmaz.

Burada net olmak gerekir: Python, type hint yazsanız da yazmasanız da dinamik tipli bir dil olmaya devam eder. Bir fonksiyona int beklerken str gönderseniz bile, kod çalışma zamanında hemen hata vermez; hata yalnızca o yanlış tipin kullanıldığı satıra gerçekten ulaşıldığında ortaya çıkar. Type hint'ler bu davranışı değiştirmez; onlar sadece bir "belge" ve analiz katmanıdır, çalışma zamanı zorlaması değildir.

Peki bu durumda neden zaman ayırıp type hint yazılır? Cevap, kod tabanı büyüdükçe ortaya çıkan pratik ihtiyaçtan geliyor. On satırlık bir betikte hangi fonksiyonun ne beklediğini akılda tutmak kolaydır. Ama proje onlarca dosyaya, yüzlerce fonksiyona yayıldığında, bir fonksiyonun imzasına bakıp parametre ve dönüş tiplerini anında görebilmek büyük zaman kazandırır. Ayrıca type hint yazılı kod, mypy gibi bir araçla taranarak, kodu hiç çalıştırmadan "bu fonksiyona yanlış tipte bir değer gönderiliyor" gibi hataların erkenden yakalanmasını mümkün kılar. Böylece hata, üretim ortamında bir kullanıcıyı etkilemeden, geliştirme aşamasında fark edilir. Bu yazının ilerleyen bölümlerinde tam olarak bu mekanizmayı, yani mypy'nin bu hataları nasıl yakaladığını örneklerle göreceksiniz.

Temel Sözdizimi: Değişken, Parametre ve Dönüş Tipi İpuçları

Type hint sözdizimi Python'da oldukça sadedir ve üç ana yerde kullanılır: değişken tanımlarken, fonksiyon parametrelerinde ve fonksiyonun dönüş tipini belirtirken. Bir değişkene tip ipucu eklemek için isim: tip = değer kalıbı kullanılır; örneğin yas: int = 25 yazıldığında yas değişkeninin bir tamsayı taşıması beklendiği açıkça belirtilmiş olur.

Fonksiyon parametrelerinde ise tip ipucu, parametre adının hemen ardına iki nokta üst üste ile eklenir: param: tip. Fonksiyonun dönüş tipi ise fonksiyon tanımının sonunda -> tip ile gösterilir. Koleksiyon tipleri için de aynı mantık geçerlidir; bir tamsayı listesi list[int], anahtarları metin değerleri tamsayı olan bir sözlük ise dict[str, int] şeklinde yazılır. Aşağıdaki örnek bu üç kullanımı bir arada gösterir:

def ortalama_hesapla(notlar: list[int]) -> float:
    toplam: int = sum(notlar)
    ogrenci_sayisi: int = len(notlar)
    return toplam / ogrenci_sayisi

sinif_notlari: list[int] = [80, 90, 75, 60]
sonuc: float = ortalama_hesapla(sinif_notlari)
print(sonuc)

Bu fonksiyon çalıştığında hiçbir hata vermez; type hint'ler yalnızca notlar parametresinin bir tamsayı listesi olduğunu, fonksiyonun bir float döndürdüğünü ve ara değişkenlerin hangi tipte tutulduğunu belgeler. Bu tür yazımı bir defa alışkanlık haline getirdiğinizde, fonksiyon imzasına bakmak bile o fonksiyonun ne yaptığı hakkında ciddi bir fikir verir. Sözdizimini uygulamalı örneklerle pekiştirmek isteyenler için birebir Python dersleri kapsamında bu tür fonksiyon tasarımı ve tip yazımı alıştırmaları adım adım işlenir. Sıradaki bölümde, bir değerin bazen None olabileceği durumlarda bu sözdiziminin nasıl genişletileceğini göreceksiniz.

Optional Kullanımı: Bir Değerin None Olabileceği Durumlar

Gerçek dünya kodunda bir fonksiyon her zaman beklenen tipte bir değer döndüremeyebilir. Klasik örnek: bir veritabanından kullanıcı adına göre kayıt arayan bir fonksiyon düşünün. Eğer kullanıcı bulunursa bir str (örneğin kullanıcının e-posta adresi) döner; bulunamazsa fonksiyonun mantıklı bir dönüşü None olur. Böyle bir durumda fonksiyonun dönüş tipini yalnızca str yazmak yanıltıcı olur, çünkü fonksiyon bazı durumlarda hiç str döndürmeyecektir.

Bu senaryoyu doğru şekilde ifade etmek için Optional kullanılır. Optional[str], "bu değer ya bir str'dir ya da None'dır" anlamına gelir ve str | None yazımıyla tamamen aynı anlamı taşır; ikisi de aynı durumu belirtmenin farklı yollarıdır. Aşağıdaki örnek, bir kullanıcı e-postasını arayan ve bulunamadığında None döndüren bir fonksiyonu gösterir:

from typing import Optional

def eposta_bul(kullanici_adi: str, kayitlar: dict[str, str]) -> Optional[str]:
    return kayitlar.get(kullanici_adi)

kullanicilar: dict[str, str] = {"ayse": "[email protected]"}
sonuc: Optional[str] = eposta_bul("mehmet", kullanicilar)
print(sonuc)  # None

Buradaki Optional[str] dönüş tipi, bu fonksiyonu çağıran kodun sonucu kullanmadan önce None kontrolü yapması gerektiğini açıkça hatırlatır. Parametrelerde de aynı mantık geçerlidir: bir fonksiyon isteğe bağlı bir parametre alıyor ve bu parametre gönderilmezse varsayılan olarak None kabul ediyorsa, o parametrenin tipi de Optional ile işaretlenmelidir. Bu, kodun hangi noktalarda None ile karşılaşabileceğinizi baştan görmenizi sağlayan, küçük ama etkisi büyük bir yazım alışkanlığıdır.

mypy Nedir, Nasıl Kurulur ve Çalıştırılır?

Type hint'ler tek başına Python yorumlayıcısını hiçbir şekilde durdurmaz; onlar sadece birer beyandır. Kodun gerçekten bu beyanlara uyup uymadığını denetleyen araç ise mypy'dır. mypy, dosyandaki tip ipuçlarını okuyup değişkenler, parametreler ve dönüş değerleri arasında tutarsızlık var mı diye statik analiz yapan bir araçtır — yani kodu hiç çalıştırmadan, sadece metni inceleyerek çalışır. Bu, bir derleyicinin yaptığı işe benzer ama Python yine de yorumlanan bir dil olarak kalır; mypy yalnızca bir kontrol katmanı ekler.

Kurulumu ve ilk çalıştırması birkaç dakikada tamamlanır. Aşağıdaki adımları sırasıyla izleyebilirsin:

  1. Kurulum: Terminalde pip install mypy komutunu çalıştır (bazı sistemlerde python3 -m pip install -U mypy şeklinde kullanmak gerekebilir).
  2. Doğrulama: Kurulumun başarılı olup olmadığını görmek için mypy --version yaz; ekranda bir sürüm numarası görüyorsan araç hazırdır.
  3. Çalıştırma: Kontrol etmek istediğin dosyaya karşı terminalden mypy dosya_adi.py komutunu çalıştır. mypy dosyayı taşımadan, olduğu yerde analiz eder.
  4. Çıktıyı okuma: Sorun yoksa mypy "Success: no issues found" benzeri bir mesaj verir. Sorun varsa her satırda dosya adı, hatanın bulunduğu satır numarası, "error" etiketi ve hatanın açıklaması sırayla listelenir; en altta ise kaç hata bulunduğunu özetleyen bir toplam satırı yer alır.

Bu dört adımı ilk kez uygulayan biri için çıktıyı doğru yorumlamak, hatanın kaynağını anlamak kadar önemlidir. Özellikle iç içe geçmiş fonksiyonlarda veya birden fazla modülü aynı anda taradığında çıktı uzayabilir; hangi satırın hangi hatayı işaret ettiğini ayırt etmek pratikle gelişir. Bu noktada birebir geri bildirim almak süreci ciddi şekilde hızlandırır — birebir Python dersleri kapsamında mypy çıktısını satır satır okuma ve gerçek proje kodları üzerinde tip hatalarını ayıklama pratiği yapılabiliyor. Kendi başına deneme yanılma yapmak yerine, bir hatanın neden oluştuğunu anlık olarak sorabilmek, statik tip kontrolü alışkanlığının kalıcı hale gelmesini sağlar.

Tip Hatası İçeren Bir Fonksiyon ve mypy'nin Yakaladığı Hata

Teoriyi somutlaştırmak için tip ipucu taşıyan ama bilinçli bir hata içeren küçük bir fonksiyon örneğine bakalım. Aşağıdaki fonksiyon yas parametresinin int olmasını bekliyor, ama fonksiyonu çağırırken bir metin (str) gönderiyoruz:

def emeklilige_kalan_yil(yas: int, emeklilik_yasi: int = 65) -> int:
    return emeklilik_yasi - yas

# Bilinçli hata: "otuz" bir int değil, str
sonuc = emeklilige_kalan_yil("otuz")
print(sonuc)

Bu dosyayı doğrudan python dosya.py ile çalıştırırsan Python hemen hata vermez; çünkü çalışma zamanında tip kontrolü yapılmaz, kod muhtemelen bir TypeError ile sonradan çökeceği başka bir noktaya kadar ilerler ya da sessizce yanlış bir sonuç üretebilir. Oysa aynı dosyayı mypy dosya.py komutuyla taradığında mypy, satır numarasını ve hatanın türünü belirten net bir çıktı üretir; format genellikle şu şekildedir:

dosya.py:5: error: Argument 1 to "emeklilige_kalan_yil" has incompatible type "str"; expected "int"  [arg-type]
Found 1 error in 1 file (checked 1 source file)

Buradaki kritik nokta şu: mypy bu hatayı kod hiç çalıştırılmadan, sadece dosyayı okuyarak tespit eder. Yani hatanın üretime çıkması, bir kullanıcının karşısına çıkması ya da testlerde tesadüfen yakalanması beklenmez — hata yazım anında, çalıştırma öncesinde görünür hale gelir. Özellikle büyüyen kod tabanlarında, bir fonksiyonun onlarca yerden çağrıldığı senaryolarda bu erken uyarı, saatler süren hata ayıklama sürecinin önüne geçer. Satır numarası ve beklenen/gelen tip bilgisinin çıktıda birlikte verilmesi, düzeltmeyi de doğrudan işaret eder; geliştiricinin hatayı aramasına gerek kalmaz, mypy nerede ve neyin yanlış olduğunu zaten söylemiştir.

Temel Tip İpucu Türleri

Type hint yazarken en sık ihtiyaç duyulan türler aslında sınırlı sayıdadır ve büyük çoğunluğu Python'ın yerleşik veri tipleriyle birebir örtüşür. Aşağıdaki tablo, günlük kullanımda en çok karşılaşacağın temel türleri ve kullanım senaryolarını özetliyor:

Tip Örnek Kullanım Ne Zaman Kullanılır
int yas: int Tam sayı değer taşıyan parametre veya değişkenler için
str isim: str Metin verisi taşıyan alanlar için
float fiyat: float Ondalıklı sayısal değerler için
bool aktif_mi: bool Doğru/yanlış durumu ifade eden bayraklar için
list[...] isimler: list[str] İçindeki her elemanın tipi belli olan liste yapıları için
dict[...] puanlar: dict[str, int] Anahtar-değer eşleşmesinde her iki tarafın tipi bilindiğinde
Optional[...] kullanici: Optional[str] Değerin bazen None olabildiği alanlarda

Pratikte en çok karşına çıkacak olanlar int, str ve Optional[...] kombinasyonudur; çünkü fonksiyon parametrelerinin büyük kısmı sayı veya metin taşır, veritabanından ya da bir API'den gelen veriler ise sıklıkla boş dönebilir. list[...] ve dict[...] ise özellikle bir koleksiyonu döngüyle işlerken IDE'nin içerideki elemanların hangi metotlara sahip olduğunu doğru tahmin etmesini sağladığı için pratikte fark yaratır. Bu yedi türü rahatça kullanabilmek, type hint yazımının neredeyse tamamını kapsar; daha ileri düzey tip yapıları ise ancak bu temel kurulduktan sonra anlam kazanır.

IDE Otomatik Tamamlama ve Ekip Çalışmasında Type Hint'in Pratik Faydası

Type hint yazmanın en somut faydası kod yazarken hemen ortaya çıkar. Bir fonksiyona veya değişkene tip belirttiğinde, kullandığın kod editörü artık o nesnenin hangi metotlara ve özelliklere sahip olduğunu bilir. Örneğin bir parametreyi kullanici: dict[str, str] olarak işaretlediğinde, editör o parametre üzerinden .get(), .keys() gibi sözlük metotlarını otomatik tamamlama listesinde önerir. Tip belirtilmediğinde ise editör nesnenin ne olduğunu tahmin edemez, dolayısıyla önerileri ya çok genel kalır ya da hiç gelmez.

Fonksiyon çağırırken de aynı fark hissedilir. Parametre tipleri tanımlıysa editör, fonksiyonu çağırdığın anda hangi parametrenin hangi tipte beklendiğini küçük bir ipucu kutusunda gösterir. Bu, özellikle çok parametreli fonksiyonlarda yanlış sırada veya yanlış tipte değer geçirme hatasını yazarken fark etmeni sağlar; hatayı çalıştırıp hata mesajı görene kadar beklemene gerek kalmaz.

Ekip çalışmasında bu fayda daha da belirginleşir. Birden fazla kişinin üzerinde çalıştığı bir projede, başka bir geliştiricinin yazdığı fonksiyonu ilk defa okuyorsan, tip ipuçları o fonksiyonun ne beklediğini ve ne döndürdüğünü kod içine hiç girmeden anlamanı sağlar. İmza satırını okumak genellikle fonksiyonun tüm gövdesini satır satır incelemekten çok daha hızlıdır. Bu da kod incelemelerini (code review) kısaltır, yanlış varsayımla fonksiyon çağırma hatalarını azaltır ve dokümantasyon eksikliğinin yarattığı belirsizliği bir ölçüde kapatır.

Type hint yazma alışkanlığı kazanmak, aslında Python'un temel veri tiplerini ve yapılarını ne kadar sağlam bildiğinle de doğrudan ilişkilidir. Sözlük, liste, demet gibi yapıları ve bunların birbirinden farkını net kavramayan biri için tip ipuçları anlamsız kısaltmalara dönüşür. Bu noktada kendi seviyeni görmek istiyorsan Python bilgi seviyeni ölçen kısa test nerede eksik kaldığını hızlıca göstermene yardımcı olabilir.

Type Hint'i Günlük Kodlama Alışkanlığına Dönüştürmek

Type hint öğrenen pek çok kişinin yaptığı ilk hata, mevcut projedeki tüm fonksiyonlara birden tip ipucu eklemeye çalışmaktır. Bu yaklaşım hem zaman kaybettirir hem de motivasyonu kırar, çünkü büyük bir kod tabanında geriye dönük tip ekleme işi tek seferde bitmez. Bunun yerine daha sürdürülebilir yol, bundan sonra yazacağın yeni fonksiyonlardan başlamaktır. Yeni bir fonksiyon yazarken parametrelere ve dönüş değerine tip ipucu eklemeyi standart bir adım hâline getirirsen, zamanla bu alışkanlık otomatikleşir ve eski kodu da fırsat buldukça, dokunduğun yerlerde güncellemiş olursun.

mypy'yi çalıştırmak da benzer şekilde bir alışkanlık meselesidir. Kodu yazdıktan sonra bir kereye mahsus çalıştırıp unutmak yerine, her önemli değişiklikten sonra veya commit atmadan önce mypy'yi çalıştırmayı rutine dönüştürmek, tip uyuşmazlıklarını küçükken yakalamanı sağlar. Bir hata birkaç fonksiyon derinliğinde büyümeden önce tespit edilirse, düzeltmesi de birkaç dakikayı geçmez; aynı hata haftalar sonra çalışma zamanında ortaya çıkarsa kaynağını bulmak çok daha uzun sürer.

Type hint ve mypy, Python'u daha iddialı projelerde güvenle kullanmanın pratik araçlarındandır ama bu konuyu gerçekten içselleştirmek, fonksiyon yazma, hata ayıklama ve kod okuma pratiğini düzenli sürdürmekten geçer. Bu tür konuları adım adım işleyen içerikleri takip etmek istersen güncel yazılım eğitimi içerikleri üzerinden benzer teknik konulara göz atabilirsin.

Sık Sorulan Sorular

Type hint yazmazsam Python kodum çalışmaz mı?

Çalışır. Python yorumlayıcısı tip ipuçlarını çalışma zamanında zorunlu kılmaz; bunlar yalnızca birer belgeleme ve statik analiz aracıdır. Kod, tip ipucu olsun ya da olmasın aynı şekilde çalışmaya devam eder.

Optional[str] ile str | None arasında fark var mı?

İkisi de aynı anlamı taşır: değerin ya bir metin ya da None olabileceğini belirtir. Aralarındaki fark yalnızca yazım biçimidir; str | None daha yeni ve kısa bir gösterimdir, Optional[str] ise aynı şeyi ifade eden daha önceki yazım biçimidir.

mypy hatasız kod garantisi verir mi?

Hayır. mypy yalnızca tip uyuşmazlıklarını statik olarak yakalar; mantık hataları, çalışma zamanı istisnaları veya iş kuralı hataları mypy'nin kapsamı dışındadır. Tip kontrolünden geçen kod, hâlâ hatalı sonuç üretebilir.

mypy her Python projesinde zorunlu mu?

Zorunlu değildir. Küçük betikler veya hızlı denemeler için gereksiz bir yük olabilir. Ancak birden fazla kişinin çalıştığı, büyüyen veya uzun vadeli bakımı olan projelerde tip kontrolü ciddi bir güvenlik katmanı sağlar.

Type hint'ler çalışma zamanında performansı etkiler mi?

Standart kullanımda etkisi ihmal edilebilir düzeydedir. Tip ipuçları çoğunlukla yorumlayıcı tarafından çalışma zamanında zorlanmaz; asıl kontrol mypy gibi araçlarla kod çalıştırılmadan önce yapılır.

mypy'yi hangi dosyalara karşı çalıştırmalıyım?

Genellikle projenin tamamını veya üzerinde çalıştığın modülü hedef alarak çalıştırman yeterlidir. Büyük projelerde belirli klasörleri veya dosyaları hedefleyerek de çalıştırabilirsin; önemli olan değişiklik yaptığın kodu düzenli aralıklarla kontrole tabi tutmaktır.

Type hint öğrenmek için önce hangi Python temellerini bilmeliyim?

Değişkenler, temel veri tipleri (str, int, float, bool), liste ve sözlük gibi koleksiyon yapıları ile fonksiyon tanımlama mantığını rahat kullanabiliyor olman yeterlidir. Bu temeller sağlamsa type hint sözdizimi kısa sürede oturur.

Type hint yazmak ve mypy ile kodu düzenli kontrol etmek, kısa vadede küçük bir ek adım gibi görünse de zamanla hem kendi kodunu hem başkasının kodunu okuma hızını belirgin şekilde artırır. Bu alışkanlığı fonksiyon yazma pratiğinle birlikte pekiştirmek istersen 1-1 Python özel dersi ile kendi seviyene uygun ilerleyebilirsin.

Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 300'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara