· Hakan Çelik · CPython · 3 dk okuma
PR Göndermek

PR Göndermek
CPython bugları https://bugs.python.org/ adresinde listelenir, tartışılır ve takip edilir. CLA kaydınızı yaptıktan sonra burada üzerinde çalışabileceğiniz bir issue bulup katkıda bulunabilirsiniz.
Örnek PR
Bir örnek üzerinden nasıl PR atabiliriz bakalım.
Issue olarak https://bugs.python.org/issue29418 bunu seçiyorum. Issue’yi açan kişi bazı built-in function’ların inspect kütüphanesinde bulunan isroutine fonksiyonunun False döndüğünü söylemiş. Verdiği örnekteki:
>>> inspect.isroutine(object().__str__)
False>>> object().__str__
<method-wrapper '__str__' of object object at 0x7fb92f30a0d0>bu nesne bir method-wrapper’dır. Dolayısıyla düzeltmemiz gereken şey, inspect.isroutine fonksiyonunun method-wrapper nesneleri için de True döndürmesini sağlamaktır. Fonksiyonun tanımına bakalım:
Return
Trueif the object is a user-defined or built-in function or method.
Tanıma göre nesne kullanıcı tanımlı veya built-in bir fonksiyon ya da method ise True dönmesi gerekir. method-wrapper da built-in bir method olduğundan True dönmesi beklentisi yerindedir.
CPython’u Forklamak
Ne yapacağımızı öğrendiğimize göre yapacağımız ilk iş CPython’u forklamak. Bunun için CPython GitHub deposuna gidin ve sağ üstteki Fork butonuna tıklayarak kendi hesabınıza forklayın.
Şimdi bilgisayarınızda git konsolunuzu açın ve sırası ile aşağıdaki komutları çalıştırın:
git clone https://github.com/{username}/cpython
cd cpython
./configure
makeŞu an CPython’u klonladık ve bilgisayarımıza derledik. Derlenen sürümü test etmek için:
./python.exe
Python 3.9.0a5+ (heads/master-dirty:0bae8d6f45, Apr 17 2020, 17:54:17)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>Ben bu yazıyı yazarken en güncel sürüm 3.9.0a5+ idi.
Kodu Bulmak
inspect.isroutine fonksiyonu Lib/inspect.py dosyasında bulunuyor. Dosyayı açıp ilgili fonksiyonu bulalım:
def isroutine(object):
"""Return true if the object is any kind of function or method."""
return (isbuiltin(object) or isfunction(object) or
ismethod(object) or ismethoddescriptor(object))Fonksiyon dört farklı kontrol yapıyor ancak method-wrapper nesneleri için herhangi bir kontrol içermiyor. method-wrapper nesnelerinin hangi türe ait olduğuna bakalım:
>>> type(object().__str__)
<class 'method-wrapper'>
>>> import types
>>> isinstance(object().__str__, types.MethodWrapperType)
Truetypes.MethodWrapperType kullanarak method-wrapper nesnelerini tespit edebiliyoruz.
Düzeltmeyi Yapmak
Lib/inspect.py dosyasına yeni bir ismethodwrapper fonksiyonu ekleyip isroutine fonksiyonunu güncelleyelim:
def ismethodwrapper(object):
"""Return true if the object is a method-wrapper."""
return isinstance(object, types.MethodWrapperType)
def isroutine(object):
"""Return true if the object is any kind of function or method."""
return (isbuiltin(object) or isfunction(object) or
ismethod(object) or ismethoddescriptor(object) or
ismethodwrapper(object))Yeni fonksiyonu modülün __all__ listesine de eklemeyi unutmayın.
Testi Çalıştırmak
CPython’da değişiklik yaptıktan sonra Lib/test/test_inspect.py dosyasına test eklemeniz beklenir. Mevcut testlere bakarak uygun bir test ekleyin:
def test_ismethodwrapper(self):
self.assertTrue(inspect.ismethodwrapper(object().__str__))
self.assertTrue(inspect.ismethodwrapper(object().__repr__))
self.assertFalse(inspect.ismethodwrapper(inspect.ismethodwrapper))
# isroutine artık method-wrapper için True döndermeli
self.assertTrue(inspect.isroutine(object().__str__))Testi çalıştırmak için:
./python.exe -m unittest Lib.test.test_inspect -vTestler geçtikten sonra branch oluşturma aşamasına geçebiliriz.
Branch Oluşturmak ve Commit Atmak
CPython’a katkı için her zaman konuya özel bir branch oluşturun; doğrudan main üzerinde çalışmayın:
git checkout -b fix-isroutine-method-wrapperDeğişikliklerinizi ekleyip commit atın:
git add Lib/inspect.py Lib/test/test_inspect.py
git commit -m "bpo-29418: Add ismethodwrapper() to the inspect module"PR Açmak
Branch’ı kendi fork’unuza push edin:
git push origin fix-isroutine-method-wrapperArdından GitHub’da fork reponuza gidin. GitHub size otomatik olarak “Compare & pull request” seçeneği sunacaktır. Tıklayıp PR’ınızı oluşturun.
PR açıklamasında şunlara dikkat edin:
- Başlık:
bpo-29418: Add ismethodwrapper() to the inspect module - Açıklama: Neyi düzelttiğinizi, neden düzelttiğinizi ve nasıl test ettiğinizi kısaca açıklayın
- Issue bağlantısı:
Fixes https://bugs.python.org/issue29418satırını ekleyin
Sonuç
İlk CPython PR’ınızı gönderdiniz! Core developer’ların incelemesini bekleyin; geri bildirimlere göre değişiklik yapmanız istenebilir. Sabırlı olun — büyük bir açık kaynak projesine katkıda bulunmak hem heyecan verici hem öğretici.
Not: Bu yazı 2020 yılında yapılan bir katkı üzerinden anlatılmıştır. O tarihten bu yana CPython’un hata takip sistemi tamamen GitHub Issues’a taşınmıştır.
bugs.python.orgartık yalnızca eski kayıtlar için erişilebilirdir.
Hakan Çelik

