İçeriğe geç

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ıç
Python REPL'i Etkili Kullanma: Keşif, Prototip ve Hata Ayıklamanın Sessiz Sanatı
💬 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:
python
yaz,
print("merhaba")
yaz,
exit()
yaz, kapat.
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)
    ,
    help(library.function)
    , küçük denemeler. Doc'a bakmadan, IDE'ye gitmeden.
  • 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. >>>
>>>
prompt'u görüyorsan REPL hazır. Komutu yaz Enter'a bas — sonuç anında.
>>> 2 + 2 4 >>> "merhaba".upper() 'MERHABA' >>> import math >>> math.pi 3.141592653589793
REPL'den çıkmak için
exit()
veya
quit()
veya Ctrl+D (macOS/Linux) / Ctrl+Z + Enter (Windows).

Ö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(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("hello") ['__add__', '__class__', '__contains__', ..., 'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', ...]
__
'le başlayanlar dunder (private/magic) methodlar; gerisi public API.
>>> # 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(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()
bütün modüller için de çalışır (
help(math)
,
help(os.path)
). Çıktı uzunsa pager (less) açılır; q ile çık.
>>> 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
~/.python_history
dosyasında saklanır.

Tab 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
PYTHONSTARTUP
ile manuel ekleyebilirsin (aşağıda).
🎯 Test: Senin Python'un 3.13+ ise REPL'de
os.
yazıp Tab'a basınca otomatik tamamlanma görmelisin.

PYTHONSTARTUP
— REPL'i kişiselleştir#

Her 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
~/.pythonrc
dosyasına şunu yaz:
""" ~/.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
python
çalıştırdığında otomatik:
🐍 Python 3.13.0 REPL — pp, json, re, Path, datetime hazır. >>>
pp
'yi pretty-print için kullanabilirsin:
>>> 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 sys
import os
import json
import re
from datetime import datetime, timedelta, date
from pathlib import Path
from pprint import pprint as pp
from collections import Counter, defaultdict, deque
 
# History yönetimi
try:
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ısayollar
def 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#

Bir 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()
#

Python 3.7+ ile gelen
breakpoint()
fonksiyonu, kodun herhangi bir noktasına debugger düşürmenin standart yolu.
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)
prompt'u — pdb (Python debugger) açıldı. Önemli komutlar:
KomutNe yapar
l
(list)
Bulunduğun yerin etrafındaki kodu göster
n
(next)
Sonraki satıra git (fonksiyon çağrısı içine inme)
s
(step)
Sonraki satıra git (fonksiyon içine in)
c
(continue)
Bir sonraki breakpoint'e veya bitişe kadar koş
p variable
Değişkenin değerini yazdır
pp variable
Pretty print
w
(where)
Stack trace
q
(quit)
Çık
h
(help)
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()
REPL deneyimini debugger'a taşıyor — kodu yorumla in, değişkenleri incele, çalışırken müdahale et. Print debugging'e elveda demenin yolu.
🎯 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?
    )
  • %magic
    komutları (
    %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:
Özellikpython (3.13)IPythonbpythonptpython
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
requests
kütüphanesinin %80'ini gördün — dokümana bakmadan.

Senaryo 2: CSV'den hızlı insight#

python -i -c "import pandas as pd; df = pd.read_csv('sales.csv')"
Şimdi REPL'de
df
hazır. Birkaç saniyede:
>>> 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 math import * >>> sin(pi / 2) 1.0 >>> sqrt(16) 4.0
(Production kodunda
from X import *
yapma — namespace kirletir. Ama REPL'de keşif için OK.)

vars()
ile mevcut değişkenleri listele#

>>> 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#

exit()
parantez gerektiriyor. Ctrl+D (macOS/Linux) veya Ctrl+Z + Enter (Windows) tek tuşla çıkartır.

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ı:
type()
,
dir()
,
help()
— yeni kütüphaneyi 5 dakikada anlatma.
Multi-line input — fonksiyon, döngü, class doğrudan REPL'de.
History ve tab completion (3.13+ default).
PYTHONSTARTUP
ile dotfile
— kişisel REPL ortamı kurmak.
python -i script.py
— script çalıştırıp REPL'e düşmek.
breakpoint()
ve pdb
— kodu durdurup içine bakmak.
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 (
%timeit
,
%history
,
%who
,
%save
), 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ı.

Sı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