Modüller | Modüller ve import

Kısa bir aradan sonra tekrardan beraberiz. Bu yazıda sizlere modüllerden bahsedeceğim. Aslına bakarsanız önceki bloglarda projemize dahil ettiğimiz (import) modüller vardı ve bunlardan biri de math modülü idi. Bunun bir modül olduğunu zaten biliyoruz. Ancak, 'modül' tam olarak nedir?

'Fonksiyonlar' isimli blogda fonksiyonları işledik ve her fonksiyonun belli bir görevi olduğundan söz ettik. Modül dediğimiz yapılar ise belli fonksiyonlar (veya herhangi bir komut) içeren toplu kod sayfalarıdır. Yani sık kullanılan veya birbiriyle ilişkili fonksiyonların bir araya geldiği bir paket gibidir. math kütüphanesini ele alalım.

math kütüphanesi içerisinde pow, sqrt gibi birçok fonksiyon bulunur; biliyorsunuz. Aslında math modülünün de içi aşağıdaki gibidir. Yani içerisinde birden fazla fonksiyon barındırır ve dilediğimiz zaman onu import komutuyla çağırıp istediğimiz fonksiyonla işlem yapabiliriz.

Bu isteklerimizi de elbette 'import' komutuyla yerine getirmemiz gerekir.

Python'da modüllerin birçoğu Python'un kendi geliştiricileri tarafından Python'a eklenmiştir. Bazıları da (sys modülü gibi) başka programlama dilleriyle (sys C diliyle yazıldı) yazılmıştır ve kullanılmaya devam etmektedir. Bazı modüller ise hazır olarak Python içerisinde gelmez. Bunun için çeşitli kurulumlar yapmanız gerekir. Bu kurulumlar genellikle pip veya pip3 anahtar kelimesiyle yapılır (daha sonra değineceğiz).

Burada, anlamanız gereken şey modülün ne olduğu ve modül çeşitleri arasındaki farklardır. İsterseniz yine Python'da bulunan bir modül olan 'webbrowser' vesilesiyle Python modülleri hakkında biraz daha bilgi edinelim.

Bunun için ilk önce terminali açıp Python yazarak Python Shell'ini açıyorum.

En aşağıda '>>>' ifadesi ile bizden bir şeyler girmemizi istiyor. Ben ilk olarak import webbrowser diyeceğim ve bu modülü Shell'e tanıtacağım. Hemen sonrasında daha önceki Fonksiyonlar isimli blogdan da hatırlayacağınız üzere 'dir(webbrowser)' diyeceğim.

Burada çift alt tire (double underscore '__') ifadelerinin olduğunu görüyorsunuz. Ben, webbrowser modülünün kodlarını incelemek istiyorsam webbrowser.__file__ komutunu vermeliyimdir. Bu komutu verdikten sonra Python bize, bu modülün bilgisayardaki yerini bize gösterecektir.

Bu lokasyona gidip webbrowser.py dosyasını bir editörde açarsanız içeriğini inceleyebilir ve bir modülün aslında neye benzediğini daha net anlayabilirsiniz.

Aslına bakarsanız modülleri kendimiz de yazabiliyoruz. Örneğin bir iş için sürekli olarak yazmanız gereken bir kod parçası olduğunu varsayalım. Bunu tek bir dosyada tek bir defalığına yazıp istediğiniz zaman bunu çağırıp kullanmak hoş olmaz mıydı?

Kendi Modülümüzü Yazalım

Benim zaten C:\ altında Python isimli bir klasörüm mevcut. Siz de aynısını yapın ve içerisine myModul.py isimli bir dosya açın. Bu dosya, bizim modülümüz olacak.

Bu modül, matematikteki 4 işlemi yapsın istiyorum. Bunun için içerisinde 4 adet fonksiyon açacağım.

4 rakamı ile bir derdimiz olduğunu düşünelim ve bu dört adet matematiksel işlemi 4 rakamı için uygulayacağımızı varsayalım. Fonksiyonlarımı tanımladım. Şimdi, deneme.py isimli bir dosya daha açın. Ancak bu dosyayı, birbirlerini görebilmeleri için modülümüzün olduğu dosyayla aynı lokasyona koymanız gerekiyor.

math modülüne yaptığımızın aynısını yapabildik; import myModul Bu şekilde, artık myModul içerisinde bulunan fonksiyonlara erişecek gücümüz var. Bir bakalım.

Gördüğünüz ve math modülünden hatırlayacağınız üzere myModul. (veya math.) dediğimiz zaman o kod sayfasındaki fonksiyonlara erişimimiz mevcut. İsterseniz bir toplama işlemi yapalım.

Gördüğünüz gibi sonuç başarılı bir şekilde geldi. Ancak oradaki 'None' ifadesinin ne anlama geldiğini bilmiyorsanız lütfen return isimli bloga gidiniz.

Gördüğünüz gibi modüller bu tarzda yapılardır. Üstüne bir de kendi ufak modülümüzü yazdık. Bu noktaya gelene kadar pek çok kez import etmekten bahsettik ve daha önceki bloglarda import math şeklinde içe aktarmalar yaptık. Peki, bir modülü import etmenin kaç yolu vardır ve bu yollardan hangisi en verimli olanıdır?

import Yöntemleri

import <modül adı> as <çağırırken kullanmak istediğiniz isim>

İlk yöntemimiz 'as' anahtar kelimesini içeriyor. Bir modülün ismi çok uzunsa ve daha kısa bir şekilde yazmak istiyorsanız ya da sadece istediğiniz bir kelime olsun istiyorsanız import işlemini aşağıdaki şekilde gerçekleştirmelisiniz. Nasıl olduğuna bakalım.

Örneğin ben webbrowser modülü içerisindeki fonksiyonlara erişmek için her seferinde uzun uzun webbrowser. şeklinde yazmak istemiyorum. Bunun için import webbrowser dedikten sonra 'as' anahtar kelimesini giriyorum ve istediğim ismi yazıyorum (as web). Bu sayede artık webbrowser modülü içerisindeki fonksiyonlara webbrowser. şeklinde erişmek yerine web. şeklinde de erişebilirim.

import <modül adı, modül adı, modül adı>

Her seferinde tek bir modül için; örneğin import math şeklinde çağırma işlemlerini yaptık. Ancak birden fazla modül istiyorsanız bunları alt alta yazmak yerine bir defalığına import yazıp ardından modül isimlerini girebilirsiniz. Ancak her modülü diğerinden virgül ile ayırmanız gerektiğini unutmayın.

from <modül adı> import <içe aktarmak istediğiniz fonksiyon adı>

Örneğin import math dediğinizde math modülüne ait bütün fonksiyonları içe aktarmış olursunuz. Ancak eğer sadece birkaç tane fonksiyona ihtiyacınız varsa 'from math import factorial' şeklinde bir ifade kullanabilirsiniz. Bu sayede yalnızca math modülü içerisindeki factorial fonksiyonu projenize aktarılacaktır. Ayrıca birkaç fonksiyon çağıracaksanız bunları birbirinden virgül ile ayırmanız gerekir.

from <modül adı> import *

Buradaki '*' işaretinin anlamı 'all' yani 'her şey, hepsi' şeklindedir. Bu kullanımı pek uygun görmüyorum. Zaten ben de en son ne zaman bunu yaptığımı hatırlamıyorum. Çünkü bunu yaptığınızda modül içerisindeki her şeyi buraya -tabiri caizse- sert bir şekilde boşaltmış oluyorsunuz. Bu yüzden, modül içerisinde tanımlı olan bir fonksiyon, sizin tanımladığınız fonksiyonun üstüne binebilir.

Örneğin Python'daki open() fonksiyonu dosya açmamıza olanak tanır ve bu, Python'un hazır fonksiyonudur (gömülü fonksiyon). Aynı zamanda webbrowser içerisinde de open() fonksiyonu vardır. Bu da web sitelerini açmamıza olanak tanır. Eğer from webbrowser import * ifadesini kullanırsanız o proje içerisinde bir daha Python'daki open() fonksiyonunu kullanmanıza izin verilmeyecektir.

Zararlı ise neden var? Bu şekildeki bir import kullanımı sayesinde sadece modül içerisindeki fonksiyonun ismini yazmanız, onu çağırmanız için yeterli olacaktır. Örneğin normal şartlarda math.sqrt() diyorsanız bunu direkt olarak sqrt() olarak yazabilirsiniz. Aslında bu avantaj ve az önce anlattığım dezavantaj birbirini çok iyi tamamlıyor. Bu şekilde import edilen bir modül her şeyin üstüne bineceği için Python, direkt olarak fonksiyon ismi ile çağırmanızda bir sakınca görmeyecektir.

Gördüğünüz gibi math.sqrt(16) demek yerine sqrt(16) dedim ve sonuç başarılı.


Yayınlanma Tarihi: 2022-11-23 20:20:25

Son Düzenleme Tarihi: 2022-11-25 00:26:20