Python REPL'i Etkili Kullanma: Keşif, Prototip ve Hata Ayıklamanın Sessiz Sanatı
REPL — Read-Eval-Print Loop. Python öğrenirken bunu 'hesap makinesi' gibi görüyorsun. Profesyonel olduğunda 'ikinci elin' gibi oluyor. Bu derste: tab completion, history, _ operatörü, help/dir/type, multi-line, pretty print, PYTHONSTARTUP, alternatifler (bpython, ptpython), ve breakpoint() ile debugger entegrasyonu.
Şükrü Yusuf KAYA
18 dakikalık okuma
Başlangıç💬 REPL = R(ead)-E(val)-P(rint)-L(oop)
Sen yazıyorsun → Python okuyor → değerlendiriyor → sonucu basıyor → tekrar bekliyor. Bu döngü programlama tarihinin en eski 'iyi fikirlerinden' biri. Lisp 1958'de buldu; bugün Python, JavaScript, Ruby, Julia — hepsi bu döngüyü taklit ediyor. Bir REPL'i ustaca kullanmak, Python öğrenme sürenin en hızlandırıcı becerisi.
REPL'i hafife alma#
Python öğrenirken büyük ihtimalle REPL'i şöyle kullanıyorsun: yaz, yaz, yaz, kapat.
pythonprint("merhaba")exit()Bu kullanım %5'ini kullanmak demek. Profesyonel Python geliştiricilerin REPL'i nasıl kullandığını bir gör:
- Yeni bir kütüphaneyi tanımak: API'sini keşfetmek için REPL açılır, ,
dir(library), küçük denemeler. Doc'a bakmadan, IDE'ye gitmeden.help(library.function) - Hızlı hesaplama: Tek seferlik veri dönüşümü, JSON parsing, bir CSV satırından bir şey çıkarma — REPL anında sonuç.
- Bug ayıklama: Üretim hatası geldi. Veriyi yükle, manipüle et, hangi koşulda patladığını anla.
- Kod prototip: Bir fonksiyon yazıp dosyaya koymadan önce REPL'de mantığı denersin.
- Veri keşfi: Bir DataFrame veya dict'in yapısını anlamak için interaktif olarak iç içe gez.
REPL'i iyi kullanan bir geliştirici, IDE'siz geçirdiği saatlerde de iş çıkarabilir. Bu beceri öğrenmeye değer.
Temel kullanım#
# REPL'i başlat python # veya: python3, python3.13, py
Karşına şu çıkar:
Python 3.13.0 (main, Oct 1 2024, 11:15:50) [Clang 14.0.6 ] on darwin Type "help", "copyright", "credits" or "license" for more information. >>>
>>> >>> 2 + 2 4 >>> "merhaba".upper() 'MERHABA' >>> import math >>> math.pi 3.141592653589793
REPL'den çıkmak için veya veya Ctrl+D (macOS/Linux) / Ctrl+Z + Enter (Windows).
exit()quit()Özel değişkenler — _ (underscore)#
_REPL'in sevimli bir özelliği: son işlemin sonucu otomatik değişkenine atanıyor.
_>>> 5 * 8 40 >>> _ + 10 50 >>> _ * 2 100
Hızlı zincirli hesaplama için harika. Aynı zamanda ve de var (önceki ve önceki-öncekisi), ama en kullanılanı.
______🚨 Dikkat: Sadece REPL'de "son sonuç" anlamı taşır. Dosyaya yazdığın script'te ya kullanılmayan değişken anlamı taşır (Python convention) ya da i18n (gettext)` ile ilgili. Karıştırma.
__>>> result = 100 >>> _ # son ifade 100 üretti, bu hâlâ atandı 100 >>> 5 # şimdi _'i değiştirir 5 >>> _ 5
Keşif komutları — REPL'de detektif olmak#
Bir kütüphaneye veya nesneye bakarken üç kahramanın var: , , .
dir()help()type()type() — bu nesne ne türden?#
type()>>> type(42) <class 'int'> >>> type("hello") <class 'str'> >>> type([1, 2, 3]) <class 'list'> >>> type(lambda x: x + 1) <class 'function'> >>> type(type) <class 'type'> # type'ın type'ı type :)
dir() — bu nesnenin attribute'ları neler?#
dir()>>> dir("hello") ['__add__', '__class__', '__contains__', ..., 'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', ...]
__>>> # Sadece public method'ları gör >>> [m for m in dir("hello") if not m.startswith("_")] ['capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', ...]
help() — dokümantasyon getir#
help()>>> help(str.upper) Help on method_descriptor: upper(self, /) Return a copy of the string converted to uppercase. >>> help(list.append) Help on method_descriptor: append(self, object, /) Append object to the end of the list.
help()help(math)help(os.path)>>> help() # interaktif help mode help> keywords help> topics help> modules help> quit
Bonus: ? (IPython'da)#
?Standart REPL'de yok ama IPython'da var (sonraki ders):
?In [1]: str.upper? Signature: str.upper(self, /) Docstring: Return a copy of the string converted to uppercase.
Multi-line komutlar#
REPL'de sadece tek satır değil, fonksiyon tanımı, döngü, class — hepsini yazabilirsin. Devam satırı için görünür:
...>>> def merhaba(isim): ... return f"Merhaba, {isim}!" ... >>> merhaba("Şükrü") 'Merhaba, Şükrü!' >>> for i in range(3): ... print(i, i**2) ... 0 0 1 1 2 4 >>> class Counter: ... def __init__(self): ... self.n = 0 ... def inc(self): ... self.n += 1 ... return self.n ... >>> c = Counter() >>> c.inc(), c.inc(), c.inc() (1, 2, 3)
🎯 İpucu: Multi-line bloku bitirmek için boş satır Enter — Python "bitti" diye anlar.
History ve tab completion#
Modern Python REPL'lerinde (3.13+ gerçekten gelişti) iki vazgeçilmez:
History#
- ↑ (yukarı ok): Önceki komutları getir.
- ↓ (aşağı ok): Sonraki.
- Ctrl+R: history'de geri arama (bash benzeri).
REPL kapansa bile history kaybolmaz. Default dosyasında saklanır.
~/.python_historyTab Completion#
3.13'ten önce vanilla REPL'de tab completion yoktu — IPython kullanıyordu insanlar. 3.13 ile default REPL artık tab completion ve syntax highlight var.
>>> import os >>> os.<TAB> # bütün os.X attribute'larını göster
3.13 öncesi REPL'inde tab completion istiyorsan ile manuel ekleyebilirsin (aşağıda).
PYTHONSTARTUP🎯 Test: Senin Python'un 3.13+ ise REPL'de yazıp Tab'a basınca otomatik tamamlanma görmelisin.
os.PYTHONSTARTUP — REPL'i kişiselleştir#
PYTHONSTARTUPHer REPL açtığında otomatik çalışacak Python kodu yazabilirsin. PYTHONSTARTUP environment variable'ına bir dosya yolu set edersen, REPL açılışında o dosya çalışıyor.
# ~/.zshrc veya ~/.bashrc export PYTHONSTARTUP="$HOME/.pythonrc"
Sonra dosyasına şunu yaz:
~/.pythonrc""" ~/.pythonrc — Python REPL açılışında otomatik çalışır. """ # Tab completion (3.13'ten önce default REPL'de yoktu) try: import readline import rlcompleter readline.parse_and_bind("tab: complete") except ImportError: pass # History dosyasını koru import atexit import os import readline histfile = os.path.expanduser("~/.python_history") try: readline.read_history_file(histfile) except FileNotFoundError: pass readline.set_history_length(10000) atexit.register(readline.write_history_file, histfile) # Pretty print default from pprint import pprint as pp # Sık kullandığım modüller pre-import import sys import os import json import re from datetime import datetime, timedelta from pathlib import Path # Bilgi mesajı print(f"🐍 Python {sys.version.split()[0]} REPL — pp, json, re, Path, datetime hazır.")
Şimdi her çalıştırdığında otomatik:
python🐍 Python 3.13.0 REPL — pp, json, re, Path, datetime hazır. >>>
pp>>> data = {"users": [{"name": "Şükrü", "skills": ["Python", "AI"]}, {"name": "Ali"}]} >>> pp(data) {'users': [{'name': 'Şükrü', 'skills': ['Python', 'AI']}, {'name': 'Ali'}]} >>> pp(data, depth=2) {'users': [{...}, {...}]}
Bu küçük dotfile yıllar içinde sana hayat-kurtaran bir araç olur.
python
# ~/.pythonrc — Geliştirilmiş versiyon import sysimport osimport jsonimport refrom datetime import datetime, timedelta, datefrom pathlib import Pathfrom pprint import pprint as ppfrom collections import Counter, defaultdict, deque # History yönetimitry: import readline import rlcompleter readline.parse_and_bind("tab: complete") histfile = os.path.expanduser("~/.python_history") if os.path.exists(histfile): readline.read_history_file(histfile) readline.set_history_length(10000) import atexit atexit.register(readline.write_history_file, histfile)except ImportError: pass # Renkli traceback (gelişmiş)try: import rich.traceback rich.traceback.install(show_locals=True) print("✨ Rich traceback aktif")except ImportError: pass # Bilgi mesajı_python_version = sys.version.split()[0]print(f"🐍 Python {_python_version} REPL")print(f"📦 Pre-import: json, re, Path, datetime, pp, Counter, defaultdict, deque")print(f"📜 History: ~/.python_history (10000 line)") # Kısayollardef reload(module_name): """Bir modülü yeniden yükle (REPL'de kütüphane kodu değiştirdiysen).""" import importlib return importlib.reload(module_name) def clear(): """Ekranı temizle.""" os.system("cls" if os.name == "nt" else "clear") Bu .pythonrc'yi al, kendi makinene koy — REPL deneyimin 10x değişir.
Script çalıştırıp REPL'e düşmek — -i flag#
-iBir script'i çalıştırdıktan sonra REPL'e düşmek istiyorsan (örneğin script'te tanımlı değişkenleri/fonksiyonları interaktif kullanmak):
python -i my_script.py
Script tamamlandığında, script'in tüm değişkenleri ve fonksiyonları REPL'inde mevcut.
Pratik kullanım: Bir veri seti yükleyen script yazdın, REPL'de o veriyle oyna.
# load_data.py import pandas as pd df = pd.read_csv("sales.csv") print(f"Loaded {len(df)} rows")
$ python -i load_data.py Loaded 10000 rows >>> df.head() >>> df.groupby("region").sum()
Bu pattern hızlı keşifte muhteşem.
REPL içinde debugger — breakpoint()#
breakpoint()Python 3.7+ ile gelen fonksiyonu, kodun herhangi bir noktasına debugger düşürmenin standart yolu.
breakpoint()def calculate_price(items): total = 0 for item in items: breakpoint() # ← buraya geldiğinde durur total += item["price"] * item["quantity"] return total calculate_price([ {"price": 10, "quantity": 2}, {"price": 5, "quantity": 3}, ])
Çalıştırınca:
> calculate_price() at line 4 -> total += item["price"] * item["quantity"] (Pdb)
(Pdb)| Komut | Ne yapar |
|---|---|
l | Bulunduğun yerin etrafındaki kodu göster |
n | Sonraki satıra git (fonksiyon çağrısı içine inme) |
s | Sonraki satıra git (fonksiyon içine in) |
c | Bir sonraki breakpoint'e veya bitişe kadar koş |
p variable | Değişkenin değerini yazdır |
pp variable | Pretty print |
w | Stack trace |
q | Çık |
h | Yardım |
(Pdb) p item {'price': 10, 'quantity': 2} (Pdb) p total 0 (Pdb) n # bir sonraki satır > calculate_price() at line 4 -> total += item["price"] * item["quantity"] (Pdb) p total 20 (Pdb) c # devam et
breakpoint()🎯 PYTHONBREAKPOINT env var ile farklı debugger çağırabilirsin:
# IPython tabanlı debugger (renkli, tab completion) pip install ipdb PYTHONBREAKPOINT=ipdb.set_trace python my_script.py
Alternatif REPL'ler — vanilla'dan daha iyi#
Python 3.13'ün vanilla REPL'i çok iyileşti ama hâlâ alternatifler değerli:
IPython#
En yaygın alternatif. Sıradaki ders detayda anlatıyor (Modül 1, Ders 10).
- Renkli output, syntax highlight
- ile help (
?)str.upper? - komutları (
%magic,%timeit,%history)%save - Multi-line indent otomatik
- Bash escape
!ls
pip install ipython ipython
bpython#
Daha az popüler ama kendine has fanları olan bir alternatif.
- Gerçek-zamanlı autocomplete (Tab beklemeden)
- Inline syntax check
- Yan panelde docstring popup
pip install bpython bpython
ptpython#
Modern, IPython benzeri ama daha hafif.
- Multi-line edit (gerçek bir editor gibi)
- Autocomplete
- Tema desteği
- IPython integrate edilebilir
pip install ptpython ptpython # IPython entegrasyonu ptpython --interactive
Karşılaştırma:
| Özellik | python (3.13) | IPython | bpython | ptpython |
|---|---|---|---|---|
| Tab completion | ✅ | ✅ | ✅ | ✅ |
| Syntax highlight | ✅ | ✅ | ✅ | ✅ |
| Multi-line edit | ⚠️ | ⚠️ | ⚠️ | ✅✅ |
| Magic commands | ❌ | ✅ | ❌ | ⚠️ |
| Inline doc | ❌ | ✅ (?) | ✅ | ✅ |
| Bash escape | ❌ | ✅ (!) | ❌ | ❌ |
| Nicely scriptable | ✅ | ⚠️ | ❌ | ⚠️ |
Pratik tavsiye: Default Python REPL (3.13+) günlük iş için yeter. Veri analizi/AI ağırlıklı çalışıyorsan IPython öncelikli olsun (Jupyter için zaten gerek). ptpython multi-line refactor için ek araç.
Gerçek hayat kullanımları#
REPL'i sadece "merhaba dünya" için kullanmak israf. İşte gerçek senaryolar:
Senaryo 1: Yeni kütüphaneyi tanımak#
>>> import requests >>> dir(requests) ['ConnectionError', ..., 'get', 'post', 'put', 'delete', ..., 'session'] >>> help(requests.get) # (signature ve docstring) >>> r = requests.get("https://api.github.com") >>> r.status_code 200 >>> r.headers["content-type"] 'application/json; charset=utf-8' >>> data = r.json() >>> type(data) <class 'dict'> >>> list(data.keys())[:5] ['current_user_url', 'current_user_authorizations_html_url', ...]
5 dakikada kütüphanesinin %80'ini gördün — dokümana bakmadan.
requestsSenaryo 2: CSV'den hızlı insight#
python -i -c "import pandas as pd; df = pd.read_csv('sales.csv')"
Şimdi REPL'de hazır. Birkaç saniyede:
df>>> df.shape (10000, 12) >>> df.dtypes >>> df["region"].value_counts() >>> df.groupby("region")["amount"].sum().sort_values(ascending=False)
Senaryo 3: API testi#
>>> import requests >>> headers = {"Authorization": "Bearer xxxx"} >>> r = requests.post("https://myapi/users", json={"name": "test"}, headers=headers) >>> r.status_code 201 >>> r.json() {'id': 42, 'name': 'test', 'created_at': '2026-...'} # Postman olmadan postman; curl olmadan curl.
Senaryo 4: Veri dönüşümü (one-shot script)#
Bir JSON'u CSV'ye çevirmek istiyorsun, ama düzenli script yazmaya değmez:
>>> import json, csv >>> data = json.load(open("input.json")) >>> with open("output.csv", "w") as f: ... writer = csv.DictWriter(f, fieldnames=data[0].keys()) ... writer.writeheader() ... writer.writerows(data) ... >>> # Bitti.
REPL bu tür "tek kullanımlık" işler için en hızlı yol.
REPL ipuçları kasası#
from module import * ile hızlı access#
from module import *>>> from math import * >>> sin(pi / 2) 1.0 >>> sqrt(16) 4.0
(Production kodunda yapma — namespace kirletir. Ama REPL'de keşif için OK.)
from X import *vars() ile mevcut değişkenleri listele#
vars()>>> a = 5 >>> b = "hello" >>> def f(): pass >>> vars() {'__name__': '__main__', ..., 'a': 5, 'b': 'hello', 'f': <function f at 0x...>}
Son komutu dosyaya kaydet (3.13+)#
>>> 5 + 3 8 >>> # Az önceki komutu dosyaya yaz (3.13 manual feature)
exit yerine Ctrl+D#
exitexit()REPL'i shell escape#
3.13'te değil ama IPython'da:
In [1]: !ls In [2]: !pwd In [3]: files = !ls *.py In [4]: files ['main.py', 'utils.py']
Shell ve Python aynı session'da.
Bu derste neler kazandın?#
✓ REPL'in Read-Eval-Print-Loop mantığı ve neden bu kadar değerli olduğu.
✓ operatörü — son sonuca ulaşmak için.
_✓ Keşif kahramanları: , , — yeni kütüphaneyi 5 dakikada anlatma.
type()dir()help()✓ Multi-line input — fonksiyon, döngü, class doğrudan REPL'de.
✓ History ve tab completion (3.13+ default).
✓ ile dotfile — kişisel REPL ortamı kurmak.
PYTHONSTARTUP✓ — script çalıştırıp REPL'e düşmek.
python -i script.py✓ ve pdb — kodu durdurup içine bakmak.
breakpoint()✓ Alternatifler — IPython, bpython, ptpython.
✓ 4 gerçek senaryo — yeni kütüphane keşfi, CSV insight, API test, tek-kullanımlık dönüşüm.
Sıradaki ders: IPython detaylı turu. Magic commands (, , , ), shell escape, otomatik help, Jupyter ile bağlantısı. IPython, REPL'i "süper-REPL"e çeviriyor — modern Python iş akışının parçası.
%timeit%history%who%saveSık Sorulan Sorular
Aynı çekirdek (CPython interpreter) ama farklı arayüz. IDE'lerin REPL'leri genelde IDE features (autocomplete, syntax highlight, variable explorer) ile sarılmış oluyor. **VS Code**: 'Python: Start REPL' komutu interactive bir terminal açıyor — vanilla python ama IDE syntax highlight'ı destekliyor. **PyCharm**: 'Python Console' tab'ı, IPython entegrasyonu var. Hem IDE hem terminal REPL'lerini paralel kullan; her birinin kendine özgü pratiği var.
Yorumlar & Soru-Cevap
(0)Yorum yazmak için giriş yap.
Yorumlar yükleniyor...
İlgili İçerikler
Modül 1: Giriş ve Kurulum
Python Nedir, Neden Bu Kadar Popüler?
Öğrenmeye BaşlaModül 1: Giriş ve Kurulum
Python Sürümlerinin Tarihi: 2'den 3.14'e, AI Winter'lardan 'No-GIL' Devrimine
Öğrenmeye BaşlaModül 1: Giriş ve Kurulum