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

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.


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.


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


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 .


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

4
OP secara khusus ingin melihat kode, hanya membantu memberikan dokumentasi.
0xc0de


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.