Editör değil, çalışma ortamı
Kurulum ve araçlar dersinde VS Code'u kurup ilk betiği çalıştırdın. Bu derste onu gerçek bir Python çalışma ortamına çeviriyoruz: doğru yorumlayıcıyı seçmek, hata ayıklayıcıyla kodun içine girmek, kaydederken otomatik biçimlendirmek ve ayarları ekiple paylaşmak. Bir geliştiricinin günlük verimini en çok etkileyen şey dilin kendisi değil, araçlarını ne kadar iyi kullandığıdır. print ekleyip silerek hata aramak ile bir kesme noktasında durup tüm değişkenleri görmek arasındaki fark, dakikalar ile saniyeler arasındaki farktır.
Kurulum ve eklentiler
code.visualstudio.com adresinden işletim sistemine uygun sürümü indir. Windows yükleyicisinde "Add to PATH" ve "Add 'Open with Code' action" kutularını işaretle. macOS'ta uygulamayı Applications'a sürükledikten sonra komut paletinden Shell Command: Install 'code' command in PATH komutunu çalıştır. Böylece terminalde bir klasördeyken code . yazarak o klasörü açabilirsin.
| Eklenti | Kimlik (ID) | Ne verir |
|---|---|---|
| Python | ms-python.python | Yorumlayıcı seçimi, çalıştırma, test paneli; aşağıdakileri de getirir |
| Pylance | ms-python.vscode-pylance | Otomatik tamamlama (IntelliSense), tip denetimi, tanıma git |
| Python Debugger | ms-python.debugpy | Kesme noktası, adım adım çalıştırma |
| Jupyter | ms-toolsai.jupyter | .ipynb dosyaları ve etkileşimli pencere |
| Ruff | charliermarsh.ruff | Çok hızlı denetleyici (linter) ve biçimlendirici |
| Black Formatter | ms-python.black-formatter | Black ile biçimlendirme (Ruff'a alternatif) |
Dosya değil klasör aç
VS Code'un ayarları, yorumlayıcı seçimi ve hata ayıklama (debugging) yapılandırması çalışma alanına (workspace), yani açtığın klasöre bağlıdır. Tek bir .py dosyasını açarsan bunların hiçbiri düzgün çalışmaz. Her zaman File → Open Folder ile proje kökünü aç. Önerilen yapı:
anadolu-rapor/ ├── .venv/ # sanal ortam (git'e girmez) ├── .vscode/ │ ├── settings.json # bu projenin ayarları (ekiple paylaşılır) │ ├── launch.json # hata ayıklama yapılandırmaları │ └── extensions.json # önerilen eklentiler ├── src/rapor/ │ ├── __init__.py │ └── main.py ├── tests/ │ └── test_main.py ├── veri/siparisler.csv ├── .gitignore ├── pyproject.toml # ya da requirements.txt └── README.md
Yorumlayıcı seçimi
VS Code'daki en önemli tek ayar budur. Ctrl+Shift+P (macOS'ta Cmd+Shift+P) ile komut paletini aç, Python: Select Interpreter yaz. Liste; bulunan sistem Python'larını, conda ortamlarını ve proje klasöründeki .venv'i gösterir. .venv içindekini seç; sağ alt köşedeki durum çubuğunda 3.12.4 ('.venv': venv) gibi bir yazı görürsün. Listede yoksa "Enter interpreter path..." ile .venv/bin/python (Windows'ta .venv\Scripts\python.exe) yolunu elle ver.
Yanlış yorumlayıcı seçiliyse şu belirtileri görürsün: terminalde pip install pandas yapmışsın ama editör Import "pandas" could not be resolved diye sarı dalga çiziyor; ya da Çalıştır düğmesi ModuleNotFoundError veriyor. Paket bir Python'a, editör başka bir Python'a bakıyordur.
python.terminal.activateEnvironment ayarı). Windows'ta bu, PowerShell yürütme ilkesine takılabilir; çözümünü Windows'ta Python kurulumu dersinde gördün.Çalıştır düğmesi mi, terminal mi?
Sağ üstteki ▷ düğmesi (Run Python File) seçili yorumlayıcıyla python dosya.py komutunu entegre terminalde çalıştırır. Entegre terminali Ctrl+` ya da View → Terminal ile açarsın. İki yol arasındaki en büyük tuzak çalışma dizinidir (current working directory): betik open("veri/siparisler.csv") diyorsa, dosya betiğin yanında değil terminalin bulunduğu klasörde aranır. Çalıştır düğmesi varsayılan olarak çalışma alanının kökünden çalıştırır; sen terminalde src/rapor klasörüne girip çalıştırırsan aynı kod FileNotFoundError verir.
from pathlib import PurePosixPath
betik = PurePosixPath("/home/ayse/anadolu-rapor/src/rapor/main.py")
for cwd in ["/home/ayse/anadolu-rapor", "/home/ayse/anadolu-rapor/src/rapor"]:
print("cwd'ye göre :", PurePosixPath(cwd) / "veri" / "siparisler.csv")
proje_koku = betik.parent.parent.parent
print("Betiğe göre :", proje_koku / "veri" / "siparisler.csv")
Gerçek kodda bunu Path(__file__).resolve().parent ile yaparsın: betiğin kendi klasöründen yola çıkan yol, nereden çalıştırılırsa çalıştırılsın aynı dosyayı bulur.
Hata ayıklayıcı (debugger)
Satır numarasının soluna tıklayınca (ya da F9) kırmızı bir nokta belirir: kesme noktası (breakpoint). F5 ile hata ayıklamayı başlatınca program o satıra gelince durur ve sol panelde şunları görürsün:
- Variables: o andaki tüm yerel ve küresel değişkenler, iç içe açılabilir listeler ve sözlükler.
- Watch: izlemek istediğin ifadeler; örneğin
len(sepet)ya datoplam > 1000. - Call Stack: hangi fonksiyonun hangisini çağırdığı.
- Debug Console: durduğun yerde istediğin Python ifadesini çalıştırabileceğin konsol.
| Tuş | Eylem | Ne zaman |
|---|---|---|
| F5 | Başlat / devam et (sonraki kesme noktasına kadar) | Hata ayıklamaya başlarken |
| F10 | Step Over: satırı çalıştır, fonksiyonun içine girme | Fonksiyonun doğru çalıştığından eminsen |
| F11 | Step Into: çağrılan fonksiyonun içine gir | Hatanın o fonksiyonda olduğundan şüpheleniyorsan |
| Shift+F11 | Step Out: fonksiyonun sonuna kadar çalıştır, çağırana dön | Yanlışlıkla içine girdiysen |
| Shift+F5 | Durdur | Sorunu buldun |
Kesme noktasına sağ tıklayıp koşullu kesme noktası (conditional breakpoint) yapabilirsin: siparis["id"] == "AM-417" koşulu, 10.000 siparişlik döngüde yalnızca sorunlu kayıtta durur. Logpoint ise durmadan mesaj yazdırır; koda print eklemenin temiz hâlidir. Koddan durmak istersen breakpoint() yerleşik fonksiyonunu çağırabilirsin.
Aşağıdaki fonksiyonda bir hata var. Hata ayıklayıcıda for satırına kesme noktası koyup F10 ile ilerlesen, Variables panelinde toplam'ın her turda ne olduğunu görürdün; burada aynı bilgiyi elle yazdırıyoruz:
def sepet_toplami(sepet, indirim_orani):
toplam = 0
for urun in sepet:
toplam = urun["fiyat"] * urun["adet"] # hata: += olmalı
print(f" [izle] urun={urun['ad']:8} toplam={toplam}")
return toplam * (1 - indirim_orani)
sepet = [{"ad": "Kalem", "fiyat": 12.5, "adet": 4},
{"ad": "Defter", "fiyat": 45.0, "adet": 2},
{"ad": "Silgi", "fiyat": 7.5, "adet": 1}]
print("Sonuç:", sepet_toplami(sepet, 0.1))
İzleme çıktısı toplam'ın birikmediğini, her turda üzerine yazıldığını hemen gösterir. Hata ayıklayıcı bu "izleme"yi senin yerine, koda dokunmadan yapar.
launch.json
Betiğine argüman, ortam değişkeni ya da belirli bir çalışma dizini vermek istiyorsan Run and Debug panelindeki "create a launch.json file" bağlantısıyla .vscode/launch.json oluştur:
{
"version": "0.2.0",
"configurations": [
{
"name": "Rapor: Ekim 2026",
"type": "debugpy",
"request": "launch",
"module": "rapor.main",
"args": ["--ay", "2026-10", "--sehir", "İzmir"],
"cwd": "${workspaceFolder}",
"env": {"RAPOR_ORTAM": "test"},
"console": "integratedTerminal",
"justMyCode": true
}
]
}
${workspaceFolder} ve ${file} gibi değişkenler VS Code tarafından doldurulur. justMyCode: true, adım adım ilerlerken pandas gibi kütüphanelerin içine girmeni engeller.
Biçimlendirme ve denetim: Ruff, Black
Biçimlendirici (formatter) kodunu tek tip bir stile sokar: girintiler, boşluklar, satır uzunluğu, tırnaklar. Ekipte "virgülden sonra boşluk" tartışması biter. Ruff hem biçimlendirici hem denetleyicidir (kullanılmayan içe aktarma, tanımsız ad gibi hataları yakalar) ve çok hızlıdır. Black uzun süredir standart biçimlendiricidir; Ruff'ın biçimlendiricisi Black ile büyük ölçüde uyumludur. Birini seç, ikisini birden biçimlendirici yapma.
Ayarlar settings.json dosyasında JSON olarak tutulur. Komut paletinden Preferences: Open Workspace Settings (JSON) projeye özel dosyayı açar:
{
// Python dosyaları için
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
},
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
"python.analysis.typeCheckingMode": "basic",
"python.testing.pytestEnabled": true,
"editor.rulers": [88],
"files.trimTrailingWhitespace": true,
}
Bu dosya aslında JSONC'dir (yorumlu JSON): // yorumlarına ve sondaki virgüle izin verir. Python'ın json modülü ikisini de kabul etmez. Ayar dosyasını bir betikle okumak ya da üretmek istersen bu farkı bilmen gerekir:
import json, re
ayar_metni = """{
// Python dosyaları için
"[python]": {"editor.formatOnSave": true},
"editor.rulers": [88, 120],
}"""
satirlar = [s for s in ayar_metni.splitlines() if not s.strip().startswith("//")]
temiz = re.sub(r",\s*([}\]])", r"\1", "\n".join(satirlar))
ayarlar = json.loads(temiz)
print(ayarlar["[python]"]["editor.formatOnSave"], ayarlar["editor.rulers"])
ayarlar["editor.rulers"] = [88]
print(json.dumps(ayarlar, indent=4, ensure_ascii=False))
Dikkat: Python'daki True, JSON'da true olur; json.dumps bu çeviriyi senin yerine yapar. Ayar dosyasını f-string ile elle birleştirmek geçersiz JSON üretir.
Ayar katmanları
VS Code ayarları katmanlıdır: varsayılanlar → kullanıcı (User) ayarları (tüm projeler) → çalışma alanı (Workspace) ayarları (.vscode/settings.json). Sonraki katman öncekini ezer. Kişisel tercihlerin (yazı tipi, tema) kullanıcı ayarına, projenin kuralları (biçimlendirici, satır uzunluğu, yorumlayıcı yolu) çalışma alanı ayarına gider ve git'e eklenir.
IntelliSense ve tip ipuçları
Pylance kodunu yazarken analiz eder: nokta koyunca metotları önerir, fonksiyon imzasını gösterir, F12 ile tanıma gider, F2 ile bir adı tüm projede yeniden adlandırır. Önerilerin kalitesi tip ipuçlarına (type hints) bağlıdır. Parametrenin list[dict] olduğunu yazarsan Pylance döngüdeki elemanın sözlük olduğunu bilir; typeCheckingMode: "basic" açıksa yanlış türde argümanı kırmızıyla işaretler.
def indirimli_fiyat(fiyat: float, oran: float = 0.1) -> float:
"""Anadolu Market kampanya fiyatı."""
return round(fiyat * (1 - oran), 2)
print(indirimli_fiyat(1499.90))
print(indirimli_fiyat.__annotations__)
print(indirimli_fiyat.__doc__)
Tip ipuçları çalışma zamanında zorunlu değildir; Python onları yalnızca __annotations__'ta saklar. Ama editör ve denetim araçları için altın değerindedir. Fare imlecini fonksiyon adının üzerine getirince görünen açıklama da belge dizesinden (docstring) gelir.
Kısayollar
| Eylem | Windows / Linux | macOS |
|---|---|---|
| Komut paleti | Ctrl+Shift+P | Cmd+Shift+P |
| Dosyaya hızlı git | Ctrl+P | Cmd+P |
| Entegre terminal | Ctrl+` | Ctrl+` |
| Belgeyi biçimlendir | Shift+Alt+F | Shift+Option+F |
| Satırı yorum yap / aç | Ctrl+/ | Cmd+/ |
| Tanıma git / yeniden adlandır | F12 / F2 | F12 / F2 |
| Seçimi Python terminalinde çalıştır | Shift+Enter | Shift+Enter |
| Hata ayıklamadan çalıştır | Ctrl+F5 | Ctrl+F5 |
| Çoklu imleç | Alt+Tık | Option+Tık |
Başka editörler
| Araç | Güçlü yanı | Zayıf yanı | Kime uygun |
|---|---|---|---|
| VS Code | Ücretsiz, hafif, her dil, dev eklenti ekosistemi, uzaktan geliştirme | Kurulum ve ayar gerektirir | Çoğu geliştirici ve analist |
| PyCharm | Python'a özel derin analiz, güçlü yeniden düzenleme (refactoring), hazır test ve veritabanı araçları | Ağır; bazı özellikler ücretli | Büyük Python projeleri, Django |
| Thonny | Yeni başlayanlar için; ifadelerin adım adım nasıl hesaplandığını gösterir | Büyük projeler için yetersiz | İlk haftalar, eğitim |
| IDLE | Python ile birlikte gelir, kurulum yok | Çok temel | Hızlı deneme, kısıtlı bilgisayar |
| Spyder | MATLAB/RStudio benzeri, değişken gezgini | Genel yazılım geliştirmede sınırlı | Bilimsel hesaplama, Anaconda kullanıcıları |
| JupyterLab | Hücre hücre keşif, grafik ve tablo çıktısı | Uzun kod ve test için uygun değil | Veri analizi; Jupyter ve Colab dersinde |
.vscode/extensions.json dosyasının işidir. Ardından settings.json yorumlayıcıyı .venv'e, biçimlendiriciyi Ruff'a ayarlar ve herkes aynı stille kaydeder. Kod incelemelerinde (code review) "buraya boşluk koy" yorumları kaybolur; tartışma mantığa odaklanır. Ekip ayrıca launch.json'a "Günlük rapor (test verisi)" gibi hazır hata ayıklama yapılandırmaları koyar; böylece yeni gelen kişi ilk gün F5 ile sistemi uçtan uca çalıştırabilir.Hata ayıklayıcı nasıl çalışır?
Python, her satır çalışmadan önce haber veren bir izleme (trace) mekanizmasına sahiptir. Hata ayıklayıcılar bu kancayı (Python 3.12 ile gelen daha hızlı sys.monitoring arayüzünü ya da klasik sys.settrace'i) kullanarak kesme noktasındaki satıra gelince programı durdurur. Küçük bir izleyiciyle bunu kendin görebilirsin:
import sys
def izleyici(cerceve, olay, arg):
if olay == "line" and cerceve.f_code.co_name == "faiz":
yereller = {k: v for k, v in cerceve.f_locals.items()}
print(f"satır {cerceve.f_lineno}: {yereller}")
return izleyici
def faiz(anapara, oran, yil):
tutar = anapara
for _ in range(yil):
tutar = tutar * (1 + oran)
return round(tutar, 2)
sys.settrace(izleyici)
sonuc = faiz(10000, 0.4, 2)
sys.settrace(None)
print("Sonuç:", sonuc)
Uzaktan geliştirme
Remote - SSH eklentisiyle bir sunucudaki klasörü kendi bilgisayarındaymış gibi açarsın; kod sunucuda çalışır, sen yerel editörü kullanırsın. WSL eklentisi Windows'ta Linux ortamını, Dev Containers ise projeyi bir Docker konteynerinin içinde açar. Dev Containers ile .devcontainer/devcontainer.json dosyası Python sürümünü, eklentileri ve ayarları tanımlar; ekipteki herkes birebir aynı ortamda çalışır.
Testleri editörden çalıştırmak
python.testing.pytestEnabled açıkken Test panelinde tüm testler ağaç olarak görünür; tek bir testin yanındaki düğmeyle onu çalıştırabilir ya da hata ayıklayıcıyla içine girebilirsin. Test yazmayı Test yazma dersinde göreceksin.