Değişken tiplerinin programın çalışma anında belirlendiği dillere Dinamik Programlama dilleri denir. Dinamik yapılı dillerde kullanacağınız değişken tipinin string
, integer
veya double
olduğunu veya kullanacağınız dizinin elemanları için herhangi bir veri tipi belirtmenize gerek yoktur. Dolayısıyla bu durum programın yazım hızını bir miktar arttırıyor gibi gözükse de veri tipleri kaynaklı oluşabilecek hatalar programın çalışma anına kadar anlaşılamayabilir.
def printChars(text):
for char in text:
print(char)
Örneğin yukarıdaki gibi bir fonksiyon string
bir parametre alıp her karakterini teker teker ekrana basmaktadır. Bu fonksiyon her ne kadar string
bir parametre alması için yazılmış olsa da herhangi bir iterable nesne ile çalışabilir durumdadır fakat yanlışlıkla integer
tipli bir değişken ile çağırılırsa TypeError: 'int' object is not iterable
hatası vererek program sonlanır.
x = 1
y = '1'
print(x+y)
İkinci bir örnek olarak bu kadar bariz bir hata yapılmayacak olsa da yukarıdaki koda benzer öngörülmeyen bir durumda farklı bir tip hatası (TypeError)
ile karşılaşılır. TypeError: unsupported operand type(s) for +: 'int' and 'str'
Python'da veri tipleri sebebiyle oluşabilecek tip hatası (TypeError)
sorunlarının asgari seviyeye indirilmesi ve kodun başka bir programcı tarafından incelendiğinde daha anlaşılabilir olması için mypy
ile statik tip kontrolü yapılabilir.
mypy
, Python kodlarınızda statik olarak tip kontrolü yapabilmenizi sağlayan bir araçtır.
- Statik yazım programların okunması ve bakımını kolaylaştırır. Kodlar yazılmaktan çok okunduğu için büyük ve karışık programlarda bu önemli bir husustur.
- Statik yazım daha az test ve debug ile hataları bulmanızı sağlar. Özellikle büyük ve karmaşık projelerde önemli bir zaman tasarrufu sağlanır.
- Statik yazım kodunuzdaki bulunması zor hataları bulmanıza yardımcı olur. Böylece kodunuzun güvenilirliği artırabilir ve güvenlik sorunları azaltabilir.
- Statik yazım, hassas ve güvenilir kod tamamlama özellikli IDE'ler, statik analiz araçları vb. dahil programlama üretkenliğini veya yazılım kalitesini artırabilen çok kullanışlı geliştirme araçları oluşturmayı pratik hale getirir.
- Statik yazım, IDE'lerin daha doğru ve güvenilir kod tamamlaması, statik analiz araçları vb. programlama üretkenliğini ve yazılım kalitesini arttırabilen kullanışlı geliştirme araçları oluşturmayı pratik hale getirir
- Tek bir dil üzerinde dinamik ve statik yazımın faydalarına erişebilmeyi sağlar.
- Projeniz büyük ve karmaşıksa,
- Birden fazla kişi aynı kod üzerinde çalışıyorsa,
- Test süreçleri oldukça zaman alıyorsa (tip kontrolü geliştirme süreçlerinde hataların hızlıca bulunmasında yardımcı olur ve yapılan test sayısını azaltır),
- Projenizdeki bazı arkadaşlarınız dinamik yazım şeklini sevmezken bazıları dinamik yazımı ve Python syntax'ını seviyor olabilir.
mypy
herkesin kolayca kabul edebileceği bir çözüm olabilir, - Yukarıdakilerden hiçbiri olmasa bile projenizi geleceğe hazır bir hale getirmek istiyor olabilirsiniz. Statik yazıma ne kadar erken başlarsanız o kadar kolay alışırsınız.
Terminal üzerinde pip install mypy
komutu ile mypy
kurulumu tamamlanır.
- Python'da tip niteleme syntax'ı
Değişkenİsmi: VeriTipi
şeklinde gerçekleştirilir.
condition: bool = True
number: int = 2020
decimal: float = 13.13
name: str = "Mühendis Köyü"
numbers: list = [1, 2, 3, 4, 5, 6]
- Fonksiyon tanımlamaları şu şekilde yapılır:
def FonksiyonAdı(Parametre1:VeriTipi, Parametre2:VeriTipi) -> GeriDonüşDeğeri:
def printChars(text: str) -> None:
for char in text:
print(char)
def reverseText(text: str) -> str:
return text[::-1]
from typing import Any
def check(names: list, item:Any) -> bool:
return item in names
from typing import List
def sumList(numbers: List[int]) -> int:
return sum(numbers)
Projenizi yazarken veya yazdıktan sonra veri tipleri ile ilgili olası bir problemin testini gerçekleştirmek için terminal üzerinde mypy proje.py
komutu çalıştırılır.
# guessGame.py
number: int = input("Guess Number: ")
# ...
$ mypy guessGame.py
guessGame.py:1: error: Incompatible types in assignment (expression has type "str", variable has type "int")
- Eğer tanımlanan değişken iterable ise ve nesnenin elemanlarının tipleri de belli ise tip nitelemesi aşağıdaki şekilde yapılır.
# sample.py
from typing import Tuple
sample: Tuple[int, str, float] = (2020, "MühendisKöyü", "https://t.me/koyumuhendis")
$ mypy sample.py
sample.py:2: error: Incompatible types in assignment (expression has type "Tuple[int, str, str]", variable has type "Tuple[int, str, float]")
- Aşağıdaki
sumList
fonksiyonu, değişkenleriinteger
türde bir parametre beklerken fonksiyona gönderilen parametrenin 4. elemanınınstring
tipinde olmasından ötürü program çalışma esnasındaTypeError
verecektir. Öncesindemypy
ile kontrol edilerek hata oluşumunun önüne geçilebilir.
# sumNum.py
from typing import List
def sumList(numbers: List[int]) -> int:
return sum(numbers)
print(sumList([1,2,3,"4",5]))
$ mypy sumNum.py
sumNum.py:5: error: List item 3 has incompatible type "str"; expected "int"
Lint veya linter, programlama hatalarını, hataları, biçimsel hataları veya şüpheli yapıları işaretlemek için kullanılan statik bir kod analiz aracıdır. Editör veya IDE'lerin büyük kısmı code linting özelliğine sahiptir.
- VS Code - Python Linter
Python projenizde mypy linter'ini aktif etmek için yapılması gerekenler:
F1
veyaCtrl + Shift + P
- Üstte açılan kutucuğa
Select Linter
yazıp Python: Select Linter
- Açılan listede
mypy
seçilir - Eğer
mypy
yüklü değil ise sağ altta yüklemek için bildirim çıkacaktır
VS Code üzerinde mypy
linting aktif edilir. Böylece tip kontrolü proje yazımı sırasında aktif olarak gerçekleşir. mypy linter
kod yazımındaki hataların çoğunu yakalamaktadır. Tip kontrolünü daha kapsamlı olarak gerçekleştirmek için terminal üzerinden yapmak faydalı olabilir.
Kod üzerindeki tip nitelemeleri programın çalışmasından tamamen bağımsızdır. Yani yapılan tip nitelemeleri programın çalışmasını etkilememektedir. Eğer yazım sırasında aktif bir linter kullanmıyor veya projenizi mypy ile manuel olarak kontrol etmiyorsanız eklediğiniz tip nitelemeleri kodunuzda pasif olarak yer alır.
Örneğin aşağıdaki Python kodundaki tip nitelemeleri tamamen hatalı olarak yazılmıştır.
# sample.py
def combineNames(names:str) -> int:
return " ".join(names)
Eğer yazılan kodda mypy
ile tip kontrolü yaparsak alacağımız sonuç aşağıdaki gibi olacaktır:
$ mypy sample.py
sample.py:2: error: Incompatible return value type (got "str", expected "int")
sample.py:4: error: Argument 1 to "combineNames" has incompatible type "List[str]"; expected "str"
Fakat tip kontrolü yapmak yerine kodumuzu direkt olarak çalıştırırsak program herhangi bir hata vermeden olması gerektiği gibi çalışacaktır.
$ python sample.py
Mühendis Köyü Python