Bir Dosya Bir Modüldür
Python kodun tek bir script'in ötesine geçtiğinde, onu birden fazla dosyaya bölmek isteyeceksin. Python'un modül sistemi basittir: herhangi bir .py dosyası otomatik olarak bir modüldür ve ismiyle içe aktarılabilir.
Diyelim ki util.py dosyan var:
# util.py
def greet(name):
return f"Hello, {name}"
PI = 3.14159
Aynı dizindeki başka bir dosyadan — main.py — onu kullanabilirsin:
# main.py
import util
print(util.greet("Ada"))
print(util.PI)
python3 main.py çalıştır; Python util.py'yi bulur, bir kez çalıştırır ve üst düzeyde tanımlanan her şeyi (fonksiyonlar, değişkenler, sınıflar) util modülünün öznitelikleri olarak sunar.
Üç İçe Aktarma Biçimi
Modülün tamamını içe aktar. İçindeki şeylere modül adı üzerinden erişilir:
Belirli isimleri içe aktar. Doğrudan kullanılabilir olurlar:
Takma ad ile içe aktar. Modül adı uzun olduğunda veya iki modül aynı adı paylaştığında kullanışlıdır:
import numpy as np
import pandas as pd
# Şimdi np.array(...), pd.DataFrame(...) vb. kullan.
Dördüncü bir biçim daha var: from math import *, her şeyi isim alanına çeker. REPL denemeleri dışında bundan kaçın — bir ismin nereden geldiğini anlamayı imkânsız kılar ve sessiz isim çakışmaları yaratır.
Import'lar Ne Zaman Çalışır
Python, içe aktarılan bir modülün üst düzey kodunu bir programda ilk kez içe aktarıldığında bir kez çalıştırır. Aynı modülün sonraki içe aktarmaları önceden yüklenmiş sürümü döndürür. Yani şu:
# setup.py
print("setup module loading...")
VALUE = 42
# main.py
import setup
import setup # iki kez içe aktarıldı — ama "loading" yalnızca bir kez yazdırılır
print(setup.VALUE)
"setup module loading..." yalnızca bir kez yazdırılır. Bu önemli: modül üst düzeyine yan etkiler (dosya açmak ya da yazdırmak gibi) koyarsan, bunlar içe aktarma sırasında çalışır — bu genellikle istediğin şey değildir. Onları fonksiyonların içine koy.
Standart Kütüphane
Python, büyük bir standart modül kütüphanesiyle birlikte gelir. Birkaçını zaten gördün. Sürekli uzanacakların:
math— sqrt, sin, log,piveegibi sabitler.random— rastgele sayılar, seçimler, karıştırma.datetime— tarihler ve saatler.json— JSON okuma/yazma.os,os.path— dosya sistemi yolları ve işlemleri.pathlib— modern yol işleme, çoğu zamanos.path'tan daha hoş.re— düzenli ifadeler.collections— özelleşmiş koleksiyon tipleri (Counter,defaultdict,dequevs.).itertools,functools— iteratör ve fonksiyon yardımcıları.csv— CSV dosyaları okuma ve yazma.
Standart kütüphane zaten kurulu — pip install etmene gerek yok.
Üçüncü Parti Paketler ve pip
Standart kütüphanenin kapsamadığı her şey için Python Package Index (PyPI) yüz binlerce paket barındırır. Onları pip ile kur:
pip install requests
pip install pandas
pip install --upgrade requests
pip uninstall requests
Kurulduktan sonra, her şey gibi içe aktarılırlar:
import requests
response = requests.get("https://api.example.com/data")
print(response.status_code)
Bunu aklıselim yönetmek için birkaç ipucu:
Sanal ortamları kullan
Her şeyi genele kurmak sıkıntı yaratır. Farklı projelerin farklı sürümlere ihtiyacı vardır; bazı paketler belirli Python sürümlerine bağlıdır; bazı sistemlerde genel kurulum yönetici yetkisi gerektirir. Sanal ortam, yalnızca tek bir proje için yalıtılmış bir Python kurulumudur:
python3 -m venv .venv
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
pip install requests
Venv aktifken pip paketleri sistemine değil proje klasörüne kurar. İşin bittiğinde deactivate ile devre dışı bırak.
Bağımlılıklarını sabitle
Kurulu paketlerin listesini kaydet ki başkaları (gelecekteki sen dahil) aynı ortamı yeniden oluşturabilsin:
pip freeze > requirements.txt
Daha sonra:
pip install -r requirements.txt
Poetry, pipenv ve uv gibi araçlar bunu daha ergonomik yönetir ama öğrenmek için düz pip + requirements.txt akışı hâlâ yeterlidir.
Kendi Modüllerini Yazmak
Dosyalar arası yeniden kullanmak istediğin fonksiyonlar olduğunda, onları kendi modüllerine koy. İsimlendirme gelenekleri:
- Dosya adları
lower_snake_case.pyolmalı. - Modül düzeyindeki fonksiyonlar ve değişkenler de
lower_snake_case. - Sınıflar
PascalCasekullanır.
# shopping.py
PRICES = {"apple": 0.50, "bread": 2.00}
def total(items):
return sum(PRICES[item] for item in items)
# main.py
from shopping import total, PRICES
print(total(["apple", "bread"]))
print(PRICES)
Aynı klasördeki iki dosya birbirini içe aktarırsa, kazara bir dairesel import oluşturabilirsin. Olağan çözüm, paylaşılan kodu her ikisinin de içe aktardığı üçüncü bir dosyaya taşımaktır.
Paketler: Modül Klasörleri
Elinde bir avuçtan fazla modül olunca, onları bir pakette grupla — içinde __init__.py dosyası olan bir klasörde:
myproject/
├── main.py
└── utils/
├── __init__.py
├── text.py
└── numbers.py
Ardından:
from utils.text import slugify
from utils import numbers
print(slugify("Hello, World"))
print(numbers.mean([1, 2, 3]))
__init__.py boş olabilir; varlığı utils'i paket yapan şeydir. Modern Python, __init__.py olmadan da "namespace paketleri" destekler ama başlangıç için açık sürüm daha nettir.
Import'lar Bozulduğunda Minik Bir Kontrol Listesi
- "ModuleNotFoundError: No module named X". Ya paket kurulu değildir ya da Python'u
pip installyaptığından farklı bir yorumlayıcıdan çalıştırıyorsundur. Bir venv içindeysen, venv'in aktif olduğundan emin ol. - "ImportError: cannot import name Y from X". Modül var ama istediğin isim orada yok. Yazım hatalarını kontrol et ve modülün gerçek içeriğine bak.
- "Circular import". İki modül birbirini içe aktarıyor. Paylaşılan kodu üçüncü bir modüle taşı.
Sırada: Üçüncü Parti Paketleri Kurmak
Kendi modüllerin seni uzağa götürür ama çoğu gerçek proje PyPI'dan kütüphaneler de çeker — requests, pandas, bir test framework'ü. Bir sonraki sayfa pip'i, paketleri temizce nasıl kuracağını ve projenin bağımlılıklarını nasıl kaydedeceğini anlatıyor.
Sıkça Sorulan Sorular
Python'da modül nedir?
Modül, herhangi bir .py dosyasıdır. Python dosyaları otomatik olarak modül haline gelir — onları ismiyle (.py olmadan) içe aktarırsın. Standart kütüphane; math, json ve datetime gibi her Python kurulumuyla gelen yerleşik modüllerin büyük bir koleksiyonudur.
import X ile from X import Y arasındaki fark nedir?
import X, modülün tamamını içe aktarır ve içindeki şeylere X.something ile erişirsin. from X import Y, yalnızca Y'yi isim alanına çeker, böylece onu doğrudan Y olarak kullanabilirsin. İlki daha güvenlidir (isim çakışması olmaz); ikincisi daha derlidir.
Python paketini nasıl kurarım?
Terminalde pip install paket_adi komutunu kullan. pip, Python'un paket yöneticisidir ve modern kurulumlarla birlikte gelir. Proje yalıtımı için önce bir sanal ortam oluştur; böylece kurulan paketler projeler arasında sızmaz.