Menemukan kode sumber untuk fungsi Python bawaan?

142

Apakah ada cara untuk melihat bagaimana fungsi yang dibangun di dalam python? Maksud saya bukan hanya bagaimana menggunakannya, tetapi juga bagaimana mereka dibangun, apa kode di balik diurutkan atau menghitung dll ...?

pengguna1073865
sumber

Jawaban:

135

Karena Python adalah open source, Anda dapat membaca kode sumber .

Untuk mengetahui file apa modul atau fungsi tertentu diimplementasikan di Anda biasanya dapat mencetak __file__atribut. Sebagai alternatif, Anda dapat menggunakan inspectmodul, lihat bagian Mengambil Kode Sumber dalam dokumentasi inspect.

Untuk kelas dan metode bawaan, ini tidak semudah itu inspect.getfiledan inspect.getsourceakan mengembalikan kesalahan tipe yang menyatakan bahwa objek tersebut built-in. Namun, banyak tipe bawaan dapat ditemukan di Objectssub-direktori dari trunk sumber Python . Sebagai contoh, lihat di sini untuk implementasi kelas enumerate atau di sini untuk implementasi listtipe.

Chris
sumber
Bisakah Anda memberi contoh enumerate?
Benjamin
mengikuti OP, bagaimana dengan kode sumber untuk "diurutkan"? tentu saja, inspect.getsourcefile (diurutkan) tidak berfungsi.
Quetzalcoatl
2
@Quetzalcoatl kode sumbernya sorted()ada di /Python/bltinmodule.c meskipun hanya memanggilnya list.sort()sehingga sumber aslinya ada di /Objects/listobject.c
Boris
35

Berikut ini adalah jawaban dari buku resep untuk melengkapi jawaban @Chris, CPython telah pindah ke GitHub dan repositori Mercurial tidak akan lagi diperbarui:

  1. Instal Git jika perlu.
  2. git clone https://github.com/python/cpython.git

  3. Kode akan keluar ke subdirektori bernama cpython->cd cpython

  4. Katakanlah kita sedang mencari definisi print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Lihat Python/bltinmodule.c->builtin_print()

Nikmati.

kevinarpe
sumber
21

masukkan deskripsi gambar di sini

Saya harus menggali sedikit untuk menemukan sumber berikut ini Built-in Functionskarena pencarian akan menghasilkan ribuan hasil. (Semoga berhasil mencari di antara mereka untuk menemukan sumbernya)

Lagi pula, semua fungsi tersebut didefinisikan dalam bltinmodule.cFungsi mulai denganbuiltin_{functionname}

Sumber Bawaan : https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Untuk Jenis Bawaan: https://github.com/python/cpython/tree/master/Objects

pengguna1767754
sumber
1
Daftar adalah objek / tipe, bukan fungsi bawaan. Anda dapat menemukan detail implementasi untuk itu di listobject.c github.com/python/cpython/tree/master/Objects
user1767754
19

The iPython shell membuat ini mudah: function?akan memberikan dokumentasi. function??menunjukkan juga kodenya. TAPI ini hanya berfungsi untuk fungsi python murni.

Kemudian Anda selalu dapat mengunduh kode sumber untuk (c) Python.

Jika Anda tertarik pada implementasi pythonic dari fungsionalitas inti, silakan lihat sumber PyPy .

tback
sumber
1
PyPy menggunakan RPython untuk sebagian besar barang bawaan, yang dapat hampir sama rendahnya dengan C hingga hampir sama tingginya dengan Python. Biasanya ada di antara keduanya. Dalam kedua kasus itu diketik secara statis, jadi itu bukan Python.
2
Lihat proyek awal untuk melihat kode sumber fungsi builtin: github.com/punchagan/cinspect
Thomas
8

2 metode,

  1. Anda dapat memeriksa penggunaan tentang cuplikan menggunakan help()
  2. Anda dapat memeriksa kode tersembunyi untuk modul-modul yang menggunakan inspect

1) memeriksa:

gunakan modul inpsect untuk menjelajahi kode yang Anda inginkan ... CATATAN: Anda dapat menjelajahi kode hanya untuk paket modul (alias) yang telah Anda impor

untuk misalnya:

  >>> import randint  
  >>> from inspect import getsource
  >>> getsource(randint) # here i am going to explore code for package called `randint`

2) bantuan ():

Anda cukup menggunakan help()perintah untuk mendapatkan bantuan tentang fungsi builtin beserta kodenya.

untuk eg: jika Anda ingin melihat kode untuk str (), cukup ketik - help(str)

itu akan kembali seperti ini,

>>> 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  --
Mohideen bin Mohammed
sumber
4
OP secara khusus ingin melihat kode, hanya membantu memberikan dokumentasi.
0xc0de
6

Sumber daya yang tidak dikenal adalah Panduan Pengembang Python .

Dalam (agak) masalah GH terbaru , bab baru ditambahkan untuk menjawab pertanyaan yang Anda tanyakan: Tata Letak Kode Sumber CPython . Jika sesuatu berubah, sumber daya itu juga akan diperbarui.

Dimitris Fasarakis Hilliard
sumber
1

Seperti yang disebutkan oleh @Jim, organisasi file dijelaskan di sini . Direproduksi untuk kemudahan penemuan:

Untuk modul Python, tata letak yang khas adalah:

Lib/<module>.py
Modules/_<module>.c (if theres also a C accelerator module)
Lib/test/test_<module>.py
Doc/library/<module>.rst

Untuk modul hanya ekstensi, tata letak yang khas adalah:

Modules/<module>module.c
Lib/test/test_<module>.py
Doc/library/<module>.rst

Untuk tipe bawaan, tata letak yang umum adalah:

Objects/<builtin>object.c
Lib/test/test_<builtin>.py
Doc/library/stdtypes.rst

Untuk fungsi bawaan, tata letak yang umum adalah:

Python/bltinmodule.c
Lib/test/test_builtin.py
Doc/library/functions.rst

Beberapa pengecualian:

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
Mateen Ulhaq
sumber