Dahili Python işlevleri için kaynak kodu mu arıyorsunuz?


142

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:


135

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, inspectmodü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.getfileve inspect.getsourcenesne yerleşik olduğunu belirten bir tip hata döndürür. Bununla birlikte, yerleşik türlerin birçoğu ObjectsPython 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 listtip.


İle bir örnek verebilir misiniz enumerate?
Benjamin

OP sonrasında "sıralı" kaynak koduna ne dersiniz? tabii ki, inspect.getsourcefile (sıralanmış) çalışmıyor.
Quetzalcoatl

2
İçin kaynak kodunu @Quetzalcoatl 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
Boris

35

İşte @Chris'in cevabını tamamlamak için bir yemek kitabı cevabı , CPython GitHub'a taşındı ve Mercurial deposu artık güncellenmeyecek:

  1. Gerekirse Git'i yükleyin.
  2. git clone https://github.com/python/cpython.git

  3. Kod, cpython-> adlı bir alt dizine çıkış yapacaktırcd cpython

  4. Diyelim ki biz tanımını arıyoruz print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Bakınız Python/bltinmodule.c->builtin_print()

Zevk almak.


22

resim açıklamasını buraya girin

Built-in FunctionsArama 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.cFonksiyonlar 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


1
Liste, yerleşik bir işlev değil, bir nesne / türdür. Sen bunun için uygulama bilgilerini bulabilirsiniz listobject.c github.com/python/cpython/tree/master/Objects
user1767754

19

İ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 .


1
PyPy, çoğu yerleşik öğe için RPython kullanır; bu, C kadar düşük ve Python kadar yüksek olabilir. Genellikle arasındadır. Her iki durumda da statik olarak yazılmıştır, bu yüzden gerçekten Python değildir.


8

2 yöntem,

  1. Snippet'in kullanımını aşağıdakileri kullanarak kontrol edebilirsiniz: help()
  2. kullanarak bu modüller için gizli kodu kontrol edebilirsiniz 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  --

4
OP özellikle koda bakmak istiyor, yardım sadece dokümantasyon veriyor.
0xc0de


1

@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 theres 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.