CodeBlanks Logo Icon CodeBlanks

argtypes ve restype

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

main.py
# kütüphaneden bir fonksiyon seç
# imzasını yaz ve çağır

Örnek çözüm

main.py
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?

main.py
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

Soru
libc.strlen.____ = [ctypes.c_char_p]
Cevap
libc.strlen.argtypes = [ctypes.c_char_p]

Açıklama: argtypes, argüman türlerinin listesini alır.

Uzman bölümündeki tüm dersler