Python Veri Tiplerine Giriş¶
Python isteğe bağlı olarak "tip belirteçlerini" destekler.
"Tip belirteçleri" bir değişkenin tipinin belirtilmesine olanak sağlayan özel bir sözdizimidir.
Değişkenlerin tiplerini belirterek editör ve araçlardan daha fazla destek alabilirsiniz.
Bu pythonda tip belirteçleri için hızlı bir başlangıç / bilgi tazeleme rehberidir . Bu rehber FastAPI kullanmak için gereken minimum konuyu kapsar ki bu da çok az bir miktardır.
FastAPI' nin tamamı bu tür tip belirteçleri ile donatılmıştır ve birçok avantaj sağlamaktadır.
FastAPI kullanmayacak olsanız bile tür belirteçleri hakkında bilgi edinmenizde fayda var.
Not
Python uzmanıysanız ve tip belirteçleri ilgili her şeyi zaten biliyorsanız, sonraki bölüme geçin.
Motivasyon¶
Basit bir örnek ile başlayalım:
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
Programın çıktısı:
John Doe
Fonksiyon sırayla şunları yapar:
first_name
velast_name
değerlerini alır.title()
ile değişkenlerin ilk karakterlerini büyütür.- Değişkenleri aralarında bir boşlukla beraber Birleştirir.
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
Düzenle¶
Bu çok basit bir program.
Ama şimdi sıfırdan yazdığınızı hayal edin.
Bir noktada fonksiyonun tanımına başlayacaktınız, parametreleri hazır hale getirdiniz...
Ama sonra "ilk harfi büyük harfe dönüştüren yöntemi" çağırmanız gerekir.
upper
mıydı ? Yoksa uppercase
' mi? first_uppercase
? capitalize
?
Ardından, programcıların en iyi arkadaşı olan otomatik tamamlama ile denediniz.
'first_name', ardından bir nokta ('.') yazıp otomatik tamamlamayı tetiklemek için 'Ctrl+Space' tuşlarına bastınız.
Ancak, ne yazık ki, yararlı hiçbir şey elde edemediniz:
Tipleri ekle¶
Önceki sürümden sadece bir satırı değiştirelim.
Tam olarak bu parçayı, işlevin parametrelerini değiştireceğiz:
first_name, last_name
ve bu hale getireceğiz:
first_name: str, last_name: str
Bu kadar.
İşte bunlar "tip belirteçleri":
def get_full_name(first_name: str, last_name: str):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
Bu, aşağıdaki gibi varsayılan değerleri bildirmekle aynı şey değildir:
first_name="john", last_name="doe"
Bu tamamen farklı birşey
İki nokta üst üste (:
) kullanıyoruz , eşittir (=
) değil.
Normalde tip belirteçleri eklemek, kod üzerinde olacakları değiştirmez.
Şimdi programı sıfırdan birdaha yazdığınızı hayal edin.
Aynı noktada, Ctrl+Space
ile otomatik tamamlamayı tetiklediniz ve şunu görüyorsunuz:
Aradığınızı bulana kadar seçenekleri kaydırabilirsiniz:
Daha fazla motivasyon¶
Bu fonksiyon, zaten tür belirteçlerine sahip:
def get_name_with_age(name: str, age: int):
name_with_age = name + " is this old: " + age
return name_with_age
Editör değişkenlerin tiplerini bildiğinden, yalnızca otomatik tamamlama değil, hata kontrolleri de sağlar:
Artık age
değişkenini str(age)
olarak kullanmanız gerektiğini biliyorsunuz:
def get_name_with_age(name: str, age: int):
name_with_age = name + " is this old: " + str(age)
return name_with_age
Tip bildirme¶
Az önce tip belirteçlerinin en çok kullanıldığı yeri gördünüz.
FastAPIile çalışırken tip belirteçlerini en çok kullanacağımız yer yine fonksiyonlardır.
Basit tipler¶
Yalnızca str
değil, tüm standart Python tiplerinin bildirebilirsiniz.
Örneğin şunları kullanabilirsiniz:
int
float
bool
bytes
def get_items(item_a: str, item_b: int, item_c: float, item_d: bool, item_e: bytes):
return item_a, item_b, item_c, item_d, item_d, item_e
Tip parametreleri ile Generic tipler¶
"dict", "list", "set" ve "tuple" gibi diğer değerleri içerebilen bazı veri yapıları vardır. Ve dahili değerlerinin de tip belirtecleri olabilir.
Bu tipleri ve dahili tpileri bildirmek için standart Python modülünü "typing" kullanabilirsiniz.
Bu tür tip belirteçlerini desteklemek için özel olarak mevcuttur.
List
¶
Örneğin str
değerlerden oluşan bir list
tanımlayalım.
From typing
, import List
(büyük harf olan L
ile):
from typing import List
def process_items(items: List[str]):
for item in items:
print(item)
🤓 Other versions and variants
def process_items(items: list[str]):
for item in items:
print(item)
Değişkenin tipini yine iki nokta üstüste (:
) ile belirleyin.
tip olarak List
kullanın.
Liste, bazı dahili tipleri içeren bir tür olduğundan, bunları köşeli parantez içine alırsınız:
from typing import List
def process_items(items: List[str]):
for item in items:
print(item)
🤓 Other versions and variants
def process_items(items: list[str]):
for item in items:
print(item)
Ipucu
Köşeli parantez içindeki bu dahili tiplere "tip parametreleri" denir.
Bu durumda str
, List
e iletilen tür parametresidir.
Bunun anlamı şudur: "items
değişkeni bir list
tir ve bu listedeki öğelerin her biri bir str
dir".
Bunu yaparak, düzenleyicinizin listedeki öğeleri işlerken bile destek sağlamasını sağlayabilirsiniz:
Tip belirteçleri olmadan, bunu başarmak neredeyse imkansızdır.
item
değişkeninin items
listesindeki öğelerden biri olduğuna dikkat edin.
Ve yine, editör bunun bir str
olduğunu biliyor ve bunun için destek sağlıyor.
Tuple
ve Set
¶
Tuple
ve set
lerin tiplerini bildirmek için de aynısını yapıyoruz:
from typing import Set, Tuple
def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
return items_t, items_s
🤓 Other versions and variants
def process_items(items_t: tuple[int, int, str], items_s: set[bytes]):
return items_t, items_s
Bu şu anlama geliyor:
items_t
değişkeni sırasıylaint
,int
, vestr
tiplerinden oluşan birtuple
türündedir .items_s
ise her öğesibytes
türünde olan birset
örneğidir.
Dict
¶
Bir dict
tanımlamak için virgülle ayrılmış iki parametre verebilirsiniz.
İlk tip parametresi dict
değerinin key
değeri içindir.
İkinci parametre ise dict
değerinin value
değeri içindir:
from typing import Dict
def process_items(prices: Dict[str, float]):
for item_name, item_price in prices.items():
print(item_name)
print(item_price)
🤓 Other versions and variants
def process_items(prices: dict[str, float]):
for item_name, item_price in prices.items():
print(item_name)
print(item_price)
Bu şu anlama gelir:
prices
değişkenidict
tipindedir:dict
değişkenininkey
değeristr
tipindedir (herbir item'ın "name" değeri).dict
değişkenininvalue
değerifloat
tipindedir (lherbir item'ın "price" değeri).
Optional
¶
Optional
bir değişkenin str
gibi bir tipi olabileceğini ama isteğe bağlı olarak tipinin None
olabileceğini belirtir:
from typing import Optional
def say_hi(name: Optional[str] = None):
if name is not None:
print(f"Hey {name}!")
else:
print("Hello World")
str
yerine Optional[str]
kullanmak editorün bu değerin her zaman str
tipinde değil bazen None
tipinde de olabileceğini belirtir ve hataları tespit etmemizde yardımcı olur.
Generic tipler¶
Köşeli parantez içinde tip parametreleri alan bu türler, örneğin:
List
Tuple
Set
Dict
Optional
- ...and others.
Generic types yada Generics olarak adlandırılır.
Tip olarak Sınıflar¶
Bir değişkenin tipini bir sınıf ile bildirebilirsiniz.
Diyelim ki name
değerine sahip Person
sınıfınız var:
class Person:
def __init__(self, name: str):
self.name = name
def get_person_name(one_person: Person):
return one_person.name
Sonra bir değişkeni 'Person' tipinde tanımlayabilirsiniz:
class Person:
def __init__(self, name: str):
self.name = name
def get_person_name(one_person: Person):
return one_person.name
Ve yine bütün editör desteğini alırsınız:
Pydantic modelleri¶
Pydantic veri doğrulaması yapmak için bir Python kütüphanesidir.
Verilerin "biçimini" niteliklere sahip sınıflar olarak düzenlersiniz.
Ve her niteliğin bir türü vardır.
Sınıfın bazı değerlerle bir örneğini oluşturursunuz ve değerleri doğrular, bunları uygun türe dönüştürür ve size tüm verileri içeren bir nesne verir.
Ve ortaya çıkan nesne üzerindeki bütün editör desteğini alırsınız.
Resmi Pydantic dokümanlarından alınmıştır:
from datetime import datetime
from typing import List, Union
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
signup_ts: Union[datetime, None] = None
friends: List[int] = []
external_data = {
"id": "123",
"signup_ts": "2017-06-01 12:22",
"friends": [1, "2", b"3"],
}
user = User(**external_data)
print(user)
# > User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
print(user.id)
# > 123
🤓 Other versions and variants
from datetime import datetime
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
signup_ts: datetime | None = None
friends: list[int] = []
external_data = {
"id": "123",
"signup_ts": "2017-06-01 12:22",
"friends": [1, "2", b"3"],
}
user = User(**external_data)
print(user)
# > User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
print(user.id)
# > 123
from datetime import datetime
from typing import Union
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str = "John Doe"
signup_ts: Union[datetime, None] = None
friends: list[int] = []
external_data = {
"id": "123",
"signup_ts": "2017-06-01 12:22",
"friends": [1, "2", b"3"],
}
user = User(**external_data)
print(user)
# > User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]
print(user.id)
# > 123
Info
Daha fazla şey öğrenmek için Pydantic'i takip edin.
FastAPI tamamen Pydantic'e dayanmaktadır.
Daha fazlasini görmek için Tutorial - User Guide.
FastAPI tip belirteçleri¶
FastAPI birkaç şey yapmak için bu tür tip belirteçlerinden faydalanır.
FastAPI ile parametre tiplerini bildirirsiniz ve şunları elde edersiniz:
- Editor desteği.
- Tip kontrolü.
...ve FastAPI aynı belirteçleri şunlar için de kullanıyor:
- Gereksinimleri tanımlama: request path parameters, query parameters, headers, bodies, dependencies, ve benzeri gereksinimlerden
- Verileri çevirme: Gönderilen veri tipinden istenilen veri tipine çevirme.
- Verileri doğrulama: Her gönderilen verinin:
- doğrulanması ve geçersiz olduğunda otomatik hata oluşturma.
- OpenAPI kullanarak apinizi Belgeleyin :
- bu daha sonra otomatik etkileşimli dokümantasyon kullanıcı arayüzü tarafından kullanılır.
Bütün bunlar kulağa soyut gelebilir. Merak etme. Tüm bunları çalışırken göreceksiniz. Tutorial - User Guide.
Önemli olan, standart Python türlerini tek bir yerde kullanarak (daha fazla sınıf, dekoratör vb. eklemek yerine), FastAPI'nin bizim için işi yapmasını sağlamak.
Info
Tüm öğreticiyi zaten okuduysanız ve türler hakkında daha fazla bilgi için geri döndüyseniz, iyi bir kaynak: the "cheat sheet" from mypy
.