Ana içeriğe geç

Python'da Tip Denetimi Eğitimi

Tip denetimini, farklı dillerdeki tip sistemi türlerini duck typing ve tip ipuçlarıyla (type hinting) birlikte öğrenin.
· 7 dk. oku

Yapay Zeka ile Keşfedin

Kendi Yorumlayıcısının yardımıyla Python'da tip denetimi yapılır. Python dinamik bir dil olduğundan, nesnelerin türünü zorunlu kılmaz; bu da hatalara yol açabilir ve hataları bulmayı zorlaştırır. Bunu aşmak için Python, çeşitli diğer araçlarla birlikte kullanılabilir ve kendi Duck Typing yaklaşımının yanı sıra statik tip denetimi özellikleri uygulanabilir.

Farklı programlama dillerinin benimsediği iki farklı tip sistemi vardır; aşağıda gösterilmiştir.

    1. Statik Tipli Dil
    2. Dinamik Tipli Dil

Statik Tipli Dil

Değişken türünün tip denetimi derleme zamanında yapılır. Ayrıca dilin tip sistemi, değişkenin kullanılmadan önce açıkça 'veri türü'nün belirtilmesini zorunlu kılar. Statik tipli programlama dilleri: Scala, Java, C++ vb.
Örneğin, Scala'da String bildirimi aşağıda tanımlanmıştır:
var myCar:String = "Mercedes";
Yukarıdaki kod, 'myCar' değişken adının 'Mercedes' değeriyle birlikte açıkça 'String' veri türü olarak bildirildiğini gösterir.

Dinamik Tipli Dil

Değişken türünün tip denetimi çalışma zamanında yapılır. Ayrıca dilin tip sistemi, değişkenin kullanılmadan önce açıkça 'veri türü'nün belirtilmesini zorunlu kılmaz. Dinamik tipli programlama dilleri: Python, Javascript, Ruby vb.
Örneğin, Python'da String aşağıda tanımlanmıştır:
myCar = "Mercedes"
Yukarıdaki kod, 'myCar' değişken adının açıkça bildirilmesine gerek olmadığını gösterir.

Python'da 'type()' ve 'isinstance()'

Değişken türleri, Python'un kendi 'type()' fonksiyonu kullanılarak öğrenilebilir. 'type()' çalışma zamanında, programdaki tam değişken türlerini belirlemek için hata ayıklama amacıyla kullanılabilir. Aşağıdaki örnekte bazı değişkenlerin türlerine bakalım.

my_var = 12
print(type(my_var))

Yukarıdaki kod 'int' şeklinde çıktı verir. Çünkü değişkenin veri türü tamsayıdır ve bunu belirlemede 'type()' rol oynar.

Python'un 'insinstance('obj','class')' fonksiyonu, 'obj' nesnesinin belirtilen sınıfın bir örneği olup olmadığını bilmek için kullanılabilir. Döndürülen çıktı değeri boolean olup True veya False olabilir.

my_var = "Hello"
print(isinstance(my_var,str))

Yukarıdaki kod True çıktısı verir. Çünkü değişkenin veri türü stringdir ve 'isinstance()' bunu belirlemede rol oynar.

Python'da Duck Typing

Python'da popüler bir ilke vardır: "Eğer bir ördek gibi görünüyorsa, bir ördek gibi yüzüyorsa ve bir ördek gibi vaklıyorsa, muhtemelen bir ördektir." Bu ilke basitçe şunu söyler: Nesnenin veya sınıfın türü önemli değildir; nesne benzer metot ve özelliklere sahipse belirli bir amaç için kullanılabilir.
Yukarıdaki ifadeyi daha ayrıntılı açıklığa kavuşturmak için bir örneğe bakalım.

Aşağıdaki örnekte 'Duck' ve 'Human' adlı iki sınıf vardır. Duck sınıfı 'quack' ve 'fly' metotlarını içerir. Benzer şekilde, Human sınıfının da kendi 'quack' ve 'fly' metotları vardır. Duck ve Human farklı sınıflardır ve dolayısıyla farklı nesne veya türlerdir. Ancak Human, Duck içindeki 'fly' ve 'quack' ile benzer metotlar içerir. Ayrıca 'fly_quack' adlı bir metot vardır; bu metot hem uçabildiği hem de vaklayabildiği için çoğunlukla 'Human'dan çok 'Duck' ile benzeşir.

class Duck:
    def quack(self):
        print('Quack')
    def fly(self):
        print('Flap')
class Human:
    def quack(self):
        print('Trying to Quack like a duck')
    def fly(self):
        print('Spreading my arm to flap like a duck')      
def fly_quack(thing):
    thing.quack()
    thing.fly()

'Duck' sınıfından 'du' adlı bir örnek oluşturalım ve 'fly_quack(du)' fonksiyonuna gönderelim. Benzer şekilde, Human örneği için 'h' oluşturulur ve 'fly_quack(h)' fonksiyonuna gönderilir.

du = Duck()
fly_quack(du)
h = Human()
fly_quack(h)

Yukarıdaki kodun çıktısı aşağıdadır:

Trying to Quack like a duck
Spreading my arm to flap like a duck
Quack
Flap

'Human' sınıfı 'Duck'tan farklı bir sınıf olmasına rağmen, Python insan için de 'fly_quack' fonksiyonunu çağırır. Nesne türleri farklı olsa da 'Human', Duck'takiyle benzer quack ve fly metotlarına sahip olduğundan, gereken metotları sağlar ve buna göre davranır.

Type Hint ve mypy

Python gibi Dinamik tipli bir dilin, kodu erişilebilir ve okunabilir kılan güçlü bir yönü vardır; ancak bazı dezavantajları da mevcuttur. Dezavantajlardan biri, çalışma zamanı hatalarını bulmaktır; çünkü Python değişkenin türünü zorunlu kılmaz, yani Dinamik tipli bir dildir. Bunun sonucunda, özellikle kodun uzunluğu arttıkça bulunması zor hatalar ve bug'lar ortaya çıkabilir.

Python, 3.5 sürümünden itibaren Type Hint'leri uygulamıştır. Daha eski sürümler TypeHints işlevselliğini desteklemeyebilir.

Type hinting ve mypy olmadan basit bir örnek göreceksiniz.

Aşağıdaki fonksiyon, iki tamsayıyı çıkarıp değeri döndürmesi gereken bir tamsayı çıkarma fonksiyonudur.

def sub_this(x,y):
    return 'Subtraction'
print(sub_this(8,'hello'))

Burada yukarıdaki fonksiyonun iki tamsayı 'x' ve 'y' kabul etmesi gerekir; ancak kurallar dayatılmadığı için herhangi bir veri türünü alabilir. Ayrıca, dönen değer herhangi bir şey olabilir; beklenen 'int' iken 'str' değeri ('Subtraction') döndürülmüştür.

Yukarıdaki programın benzer bir uygulamasını, ancak type hint'ler ve 'mypy' kullanarak görelim; bu sayede statik tip denetimini uygulamaya yardımcı olarak programdaki hata ve bug'ları oldukça kolay bir şekilde azaltabiliriz.

'mypy', Python'un kendi dinamik denetimi veya duck typing yaklaşımını type-hinting ile birlikte kullanan, statik tip denetimine yardımcı olan bir Python modülüdür.

'mypy' paketlerini yüklemeniz gerekir
pip install mypy

Yerel makinenizde 'mypy_example.py' adlı bir dosya oluşturup aşağıdaki kodu yazabilirsiniz.
Aşağıdaki kod, parametre olarak iki tamsayıyı girdi olarak kabul eden basit bir programdır ve '->' sonrasında döndürülen veri türünü gösterir; bu da bir 'int'tir. Ancak fonksiyonun int döndürmesi gerekirken string 'Subtracted two integers' döndürülmüştür.

def sub_this(x:int,y:int) -> int:
    return 'Subtracted two integers'
print(sub_this(8,4))

Yukarıdaki kodu terminalde aşağıdaki komutla çalıştırın.

mypy mypy_example.py

Ardından, beklenmeyen "str" dönüş değerinin bulunduğunu ve "int" ile düzeltilmesi gerektiğini belirten bir hata gösterilecektir.

Hata mesajı

Tamsayı değeri döndürülmesi için döndürülen türü iki tamsayının çıkarımı olacak şekilde değiştirelim.

def sub_this(x:int,y:int) -> int:
    return x - y
print(sub_this(8,4))

Başarı mesajı

Yukarıdaki sonuçlar, başarı mesajının yazdırıldığını ve herhangi bir sorun bulunmadığını gösterir.

Tebrikler

Tebrikler, bu eğitimin sonuna geldiniz!

Bu eğitimde, tip denetimini; çeşitli dillerdeki tip sistemi türlerini; Python yöntemleri ('type()' ve 'isinstance()'); ayrıca Python ile duck typing ve 'mypy' ile birleştirilen type hinting'i öğrendiniz.

Python hakkında daha fazla bilgi edinmek isterseniz, DataCamp'in Python ile Veri Bilimcileri için Yazılım Mühendisliği kursunu alın.

Kaynakça:

  1. Corey'nin Duck Typing hakkında YouTube videosu

Konular

İlgili