argtypes ve restype
- Python kursu
- Uzman
- Ders 21/47
- 5 dk
argtypes ve restype ile imza belirtmeyi öğrenirsin.
argtypes ve restype nedir?
Bir C fonksiyonunu doğru çağırmak için imzasını belirtmen gerekir. argtypes argüman türlerinin listesini, restype dönüş türünü tanımlar.
Örneğin libc.strlen.argtypes = [c_char_p] tek bir char* argümanı belirtir. libc.strlen.restype = c_size_t dönüşün size_t olduğunu söyler. Bu tanımlar olmadan Python varsayılan c_int'i kullanır ve size_t dönüşü yanlış kırpılabilir. Tür bildirimi, hem güvenlik hem taşınabilirlik için zorunludur.
Tür güvenliği
argtypes ve restype tanımlandığında Python argümanları otomatik dönüştürür ve yanlış türde uyarı verir. Bu, sessiz hataları önler.
Örneğin argtypes = [c_char_p] tanımlıysa ve libc.strlen(42) yazarsan Python bir TypeError fırlatır. Tür bildirimi olmadan bu sessizce yanlış çalışırdı. Bu nedenle üretime gidecek kodda her zaman imza tanımlamak gerekir. Ayrıca restype olmadan büyük dönüş değerleri kırpılabilir.
Uygulama strlen için imza yaz
import ctypes ile modülü içe aktar. ctypes.CDLL(None) ile libc yükle. libc.strlen.argtypes = [ctypes.c_char_p] ve libc.strlen.restype = ctypes.c_size_t tanımla. libc.strlen(b"merhaba") çağrısının sonucunu yazdır.
Başlangıç kodu
# kütüphaneden bir fonksiyon seç
# imzasını yaz ve çağırÖrnek çözüm
import ctypes
libc = ctypes.CDLL(None)
libc.strlen.argtypes = [ctypes.c_char_p]
libc.strlen.restype = ctypes.c_size_t
print(libc.strlen(b"merhaba"))Beklenen çıktı
7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 restype neyi belirler?
libc.strlen.restype = ctypes.c_size_t- Dönüş türünü Doğru cevap
- Kütüphane adını
- Argüman türlerini
- Fonksiyon adını
Açıklama: restype, fonksiyonun dönüş değerinin C türünü belirler.
2 İmza kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
argtypes |
Argüman türleri |
restype |
Dönüş türü |
c_char_p |
char* argüman |
c_size_t |
size_t dönüş |
3 argtypes atamasını tamamla
libc.strlen.____ = [ctypes.c_char_p]
libc.strlen.argtypes = [ctypes.c_char_p]
Açıklama: argtypes, argüman türlerinin listesini alır.