Yerleşik işlevlerin python'da nasıl çalıştığını görmenin bir yolu var mı? Ben sadece onları nasıl kullanılacağı anlamına gelmez, aynı zamanda nasıl inşa edildi, sıralı veya numaralandırma vb arkasında kod nedir ...?
Yerleşik işlevlerin python'da nasıl çalıştığını görmenin bir yolu var mı? Ben sadece onları nasıl kullanılacağı anlamına gelmez, aynı zamanda nasıl inşa edildi, sıralı veya numaralandırma vb arkasında kod nedir ...?
Yanıtlar:
Python açık kaynak olduğundan kaynak kodunu okuyabilirsiniz .
Belirli bir modül veya işlevin hangi dosyada uygulandığını bulmak için genellikle __file__
özniteliği yazdırabilirsiniz . Alternatif olarak, inspect
modülü kullanabilirsiniz , belgelerindeki Kaynak Kodunu Alma bölümüne bakın inspect
.
İçin yerleşik sınıflar ve yöntemler bu yüzden beri basit değildir inspect.getfile
ve inspect.getsource
nesne yerleşik olduğunu belirten bir tip hata döndürür. Bununla birlikte, yerleşik türlerin birçoğu Objects
Python kaynak gövdesinin alt dizininde bulunabilir . Örneğin, bakınız burada numaralandırmak sınıfının uygulanması için veya buraya uygulanması için list
tip.
sorted()
olduğu /Python/bltinmodule.c sadece çağırır rağmen list.sort()
gerçek kaynağı olduğunu bu yüzden /Objects/listobject.c
İşte @Chris'in cevabını tamamlamak için bir yemek kitabı cevabı , CPython GitHub'a taşındı ve Mercurial deposu artık güncellenmeyecek:
git clone https://github.com/python/cpython.git
Kod, cpython
-> adlı bir alt dizine çıkış yapacaktırcd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Zevk almak.
Built-in Functions
Arama binlerce sonuç getireceği için aşağıdakilerin kaynağını bulmak için biraz kazmak zorunda kaldım . (Kaynağının nerede olduğunu bulmak için herhangi birini arıyor iyi şanslar)
Neyse, tüm bu fonksiyonlar tanımlanır bltinmodule.c
Fonksiyonlar ile başlarbuiltin_{functionname}
Yerleşik Kaynak: https://github.com/python/cpython/blob/master/Python/bltinmodule.c
Yerleşik Türler için: https://github.com/python/cpython/tree/master/Objects
listobject.c
github.com/python/cpython/tree/master/Objects
İpython kabuk bu kolaylaştırır: function?
Size belgeleri verecektir. function??
kodu da gösterir. AMA bu sadece saf python işlevleri için çalışır.
Ardından her zaman (c) Python'un kaynak kodunu indirebilirsiniz .
Temel işlevlerin pythonic uygulamaları ile ilgileniyorsanız PyPy kaynağına bir göz atın .
2 yöntem,
help()
inspect
1) inceleyin:
İstediğiniz kodu keşfetmek için inpsect modülünü kullanın ... NOT: yalnızca içe aktardığınız modüller (aka) paketleri için kodu keşfedebilirsiniz
örneğin:
>>> import randint
>>> from inspect import getsource
>>> getsource(randint) # here i am going to explore code for package called `randint`
2) yardım ():
help()
yerleşik işlevler ve kodu hakkında yardım almak için komutu kullanabilirsiniz .
örneğin: str () kodunu görmek istiyorsanız, - help(str)
bu şekilde geri dönecek,
>>> help(str)
Help on class str in module __builtin__:
class str(basestring)
| str(object='') -> string
|
| Return a nice string representation of the object.
| If the argument is a string, the return value is the same object.
|
| Method resolution order:
| str
| basestring
| object
|
| Methods defined here:
|
| __add__(...)
| x.__add__(y) <==> x+y
|
| __contains__(...)
| x.__contains__(y) <==> y in x
|
| __eq__(...)
| x.__eq__(y) <==> x==y
|
| __format__(...)
| S.__format__(format_spec) -> string
|
| Return a formatted version of S as described by format_spec.
|
| __ge__(...)
| x.__ge__(y) <==> x>=y
|
| __getattribute__(...)
-- More --
Oldukça bilinmeyen bir kaynak Python Geliştirici Kılavuzu .
Yakın bir geçmişte ortaya çıkan GH sayısında , sorduğunuz soruyu ele almak için yeni bir bölüm eklenmiştir: CPython Kaynak Kodu Düzeni . Bir şeyin değişmesi gerekirse, bu kaynak da güncellenir.
@Jim tarafından belirtildiği gibi, dosya organizasyonu burada açıklanmaktadır . Keşif kolaylığı için çoğaltılmıştır:
Python modülleri için tipik düzen:
Lib/<module>.py Modules/_<module>.c (if there’s also a C accelerator module) Lib/test/test_<module>.py Doc/library/<module>.rst
Yalnızca uzantı modülleri için tipik düzen:
Modules/<module>module.c Lib/test/test_<module>.py Doc/library/<module>.rst
Yerleşik tipler için tipik düzen:
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rst
Yerleşik işlevler için tipik düzen:
Python/bltinmodule.c Lib/test/test_builtin.py Doc/library/functions.rst
Bazı istisnalar:
builtin type int is at Objects/longobject.c builtin type str is at Objects/unicodeobject.c builtin module sys is at Python/sysmodule.c builtin module marshal is at Python/marshal.c Windows-only module winreg is at PC/winreg.c
enumerate
?