Konunun Tarihçesi
İşlev anotasyonları Python 3.0'da ortaya çıkmıştır ve type hints (tip ipuçları) mekanizması PEP 484'te tanımlanmış, 3.5 ile birlikte eklenmiştir. Araç, kodu statik analiz etmek, otomatik tamamlama sağlamak ve okunabilirliği artırmak için geliştirilmiştir — typing adlı standart kütüphane, değişkenlerin, girişlerin ve işlevlerin döndürdüğü değerlerin beklenen türlerini açıkça belirtmeye olanak tanır.
Sorun
Python dinamik bir dil olduğundan, değişkenlerin türleri çalışma zamanında değişebilir ve bu, yalnızca programın çalışması sırasında hatalara yol açabilir. Anotasyonlar kodun çalışmasını etkilemez, ancak yanlış kullanımlarda programcıların "katı tip denetimi" yanılsamasına kapılmasına neden olabilir.
Çözüm
Tip anotasyonları, dokümantasyon, mypy, pylance, pyright ve benzeri araçlarla otomatik kontrol için kullanılır ve IDE ile entegrasyon sağlar. Bir parametre listesinden sonra iki nokta üst üste ve ardından bir ok ile gerçekleştirilir:**
def greet(name: str, times: int = 1) -> None: for _ in range(times): print(f"Hello, {name}!") # Sözlük işleme işlevi için doğru anotasyon from typing import Dict, List def transform(data: Dict[str, List[int]]) -> float: return sum(sum(lst) for lst in data.values()) / 10
Anahtar özellikler:
Python "otomatik olarak" anotasyonlardaki türlerle uyumu kontrol edebilir mi?
Hayır! Tür kontrolü yalnızca dışarıdan statik analiz araçlarıyla yapılır; örneğin, mypy. Python çalışma zamanında anotasyonların içeriğini tamamen göz ardı eder.
def f(x: int): return x * 2 print(f('oops')) # str türü, hata olmayacak!
Anotasyonlar nerede saklanır ve çalışma zamanında nasıl alınabilir, bunun ne yararı olabilir?
Özel bir annotations özniteliğinde saklanır:
def add(x: int, y: int) -> int: return x + y print(add.__annotations__) # {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
Bunu, veri doğrulama, dokümantasyon otomatik oluşturma, serileştirme vb. için üçüncü taraf kitaplıkları kullanır.
Herhangi bir değişkeni anotlayabilir miyiz, yalnızca işlevler mi, küresel alanda ne olacak?
Anotlayabiliriz, hem yerel hem de küresel değişkenleri iki nokta üst üste ile, bu da çalışmayı etkilemez:
index: int = 0 def func(x: 'User') -> None: ...
Kurumsal bir projede, tüm geliştiriciler aktif olarak anotasyonları uygulamaya başladı ve işlevlerin argümanlarının gerçek türleri genellikle belirtilenlerle uyuşmuyordu. Python bu hataları geçiyor, beklenmedik hatalar sadece iş mantığının derinliklerinde ortaya çıkıyordu. mypy yapılandırması eksikti.
Artılar:
Eksiler:
Type hints kullanımı ve CI içinde mypy'nin zorunlu çalıştırılması, ayrıca annotations üzerinden otomatik dokümantasyon oluşturma:
Artılar:
Eksiler: