Düzenli ifadelerde sub metodu

Selamlar,
Düzenli ifadelerde verilen aşağıdaki örnekte degistir fonksiyonu çağırılırken neden parametre almıyor. Parametre ataması burada nasıl yapılmaktadır? Bu yapıyı ilk kez görüyorum.
https://python-istihza.yazbel.com/standart_moduller/regex.html

    import re

    derle = re.compile("çile[kğ]", re.IGNORECASE)

    def degistir(nesne):
        a = {"çileğ":"eriğ", "Çileğ":"Eriğ", "Çilek":"Erik", "çilek":"erik"}
        b = nesne.group().split()
        for i in b:
            return a[i]

    print(derle.sub(degistir, metin))

Bu gibi fonksiyon cağırma olayını aslınde sıklıkla gui tasarlarken karşılaşırsınız(buton öağırmak gibi)

Ama bu örnekte sub fonksiyonu bir fonksiyon alıyor ve metin adlı değişkeni parametresine ekliyor

sub fonksiyonu parametre olarak değistir fonksiyonunu alıyor evet ama değistir fonksiyonunun parametresi yok yani
print(derle.sub(degistir(param1), metin))
şeklinde olmasını beklerdim çünkü degistir fonksiyonu 1 parametre ile tanımlanmış. degistir fonksiyonunun alması gereken 1 parametre burada nasıl degistir fonksiyonuna atanmakta?

Yanlış bilmiyorsam sihirli metotlar kullanılıyor

def topla(sayı1, sayı2):
	print(sayı1 + sayı2)
	
def deneme(fonksiyon, parametre1, parametre2):
	fonksiyon.__call__(parametre1, parametre2)


deneme(topla, 4, 5)

call adlı sihirli metottan yararlandık burada, tabi bunu sadece örnek olarak verdim.

ama burada degistir fonksiyonu öyle tanımlanmamış bu tanımlama sub fonksiyonunun içinde mi tanımlanmıştır?

Evet sub fonk. İçinde.

direk parantezler ile de çağırabilir ama __call__ magic metodunu kullanmak daha iyi gibi (sanırım)
__call__ aynı zamanda sınıf örneklerini fonkisyon gibi çağırabilmemize de yarıyor
https://www.geeksforgeeks.org/__call__-in-python/

1 Beğeni

Merhaba.

Alıyor, adı da nesne:


Zaten orada degistir fonksiyonu çağırılmamış ki, sadece parametre olarak verilmiş.

derle.sub fonksiyonu degistir fonksiyonunu çağırırken parametre de veriyor.

Sihirli metodların konu ile alakası yok. Ama sihirli metodlar biz fark etmeden bir sürü yerde kullanılıyor zaten.

Dediğim gibi, konunun sihirli metodlar ile alakası yok. Bu verdiğiniz kod şunun ile eşdeğer:

def topla(sayı1, sayı2):
	print(sayı1 + sayı2)
	
def deneme(fonksiyon, parametre1, parametre2):
	fonksiyon(parametre1, parametre2)

Hayır. Biz normal şartlarda sihirli metodları kullanmamalıyız, sihirli metodları yorumlayıcı kendi kullanıyor.

Evet, sınıfları fonksiyon gibi çağırmamızı sağlayan da metaclass’daki __call__. identifier() sözdizimi identifier.__call__ fonksiyonunun çağırılmasını sağlıyor zaten.

3 Beğeni

hocam burayı ya tam bilmiyorum yada kafam karıştı biraz daha açıklayabilir misiniz?

Burası diğer cümleye ait.

Yukarıda @halil_ibrahim_avsar’a cevap yazarken örnek gösterdiğim gibi, fonksiyon() ile fonksiyon.__call__()'ı aynı işi yapıyor.

1 Beğeni

peki bu nasıl oluyor böyle bir yapıyla ilk kez karşılaşıyorum derle.sub fonksiyonu arka planda nasıl işliyor.

https://github.com/python/cpython/blob/master/Modules/_sre.c#L1088

item = PyObject_CallOneArg(filter, match);

Buradaki

filter sizin degistir fonksiyonu,
match ise derlediğiniz regex (derle) ile metin üzerinde bulunan bir eşleşme.

Siz fonksiyonun kendisini re.sub’a argüman olarak veriyorsunuz. re.sub bu fonksiyonun imzasının “yalnız bir argüman (re.match objesi) alıp geriye bir string döndüren” şeklinde olmasını istiyor. Ne zaman bir eşleşme bulursa, o match objesini sizin pasladığınız fonksiyona gönderip, fonksiyonunuzun döndürdüğü string’i metine yerleştiriyor.

1 Beğeni

Konu ile alakalı basit bir örnek verdik zaten:

. operator olarak algıladım pardon!
:slight_smile:

Cevaplar için teşekkürler