Tìm mã nguồn cho các hàm Python tích hợp?


142

Có cách nào để xem các hàm tích hợp hoạt động trong python không? Tôi không có ý chỉ sử dụng chúng, mà còn được xây dựng như thế nào, mã đằng sau được sắp xếp hoặc liệt kê, v.v ...?

Câu trả lời:


135

Vì Python là mã nguồn mở nên bạn có thể đọc mã nguồn .

Để tìm ra tập tin mà một mô-đun hoặc chức năng cụ thể được triển khai trong bạn thường có thể in __file__thuộc tính. Ngoài ra, bạn có thể sử dụng inspectmô-đun, xem phần Lấy mã nguồn trong tài liệu của inspect.

Đối với các lớp và phương thức dựng sẵn, điều này không đơn giản vì inspect.getfileinspect.getsourcesẽ trả về một lỗi loại cho biết đối tượng được tích hợp sẵn. Tuy nhiên, nhiều kiểu dựng sẵn có thể được tìm thấy trong Objectsthư mục con của trung kế nguồn Python . Ví dụ, xem ở đây để thực hiện lớp liệt kê hoặc ở đây để thực hiện listkiểu.


Bạn có thể cho một ví dụ với enumerate?
Benjamin

Theo OP, làm thế nào về mã nguồn cho "được sắp xếp"? tất nhiên, notify.getsourcefile (đã sắp xếp) không hoạt động.
Quetzalcoatl

2
@Quetzalcoatl mã nguồn cho sorted()là trong /Python/bltinmodule.c mặc dù nó chỉ gọi list.sort()nên nguồn thực sự nằm trong /Objects/listobject.c
Boris

35

Dưới đây là câu trả lời của sách dạy nấu ăn để bổ sung cho câu trả lời của @Chris, CPython đã chuyển sang GitHub và kho lưu trữ Mercurial sẽ không còn được cập nhật:

  1. Cài đặt Git nếu cần thiết.
  2. git clone https://github.com/python/cpython.git

  3. Mã sẽ kiểm tra thư mục con được gọi là cpython->cd cpython

  4. Hãy nói rằng chúng tôi đang tìm định nghĩa của print()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! Xem Python/bltinmodule.c->builtin_print()

Thưởng thức.


21

nhập mô tả hình ảnh ở đây

Tôi đã phải đào một ít để tìm ra nguồn sau đây Built-in Functionsvì việc tìm kiếm sẽ mang lại hàng ngàn kết quả. (Chúc may mắn tìm kiếm bất kỳ ai trong số những người tìm thấy nguồn gốc của nó)

Dù sao, tất cả các chức năng được xác định trong bltinmodule.cChức năng bắt đầu bằngbuiltin_{functionname}

Nguồn tích hợp: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Đối với các loại tích hợp: https://github.com/python/cpython/tree/master/Objects


1
Danh sách là một đối tượng / loại, không phải là hàm dựng sẵn. Bạn có thể tìm thấy các chi tiết triển khai cho điều đó trong listobject.c github.com/python/cpython/tree/master/Objects
user1767754

19

Các ipython vỏ làm cho điều này dễ dàng: function?sẽ cung cấp cho bạn các tài liệu hướng dẫn. function??cũng hiển thị mã. NHƯNG điều này chỉ hoạt động cho các chức năng python thuần.

Sau đó, bạn luôn có thể tải xuống mã nguồn cho (c) Python.

Nếu bạn quan tâm đến việc triển khai pythonic của chức năng cốt lõi, hãy xem nguồn PyPy .


1
PyPy sử dụng RPython cho hầu hết các công cụ tích hợp sẵn, có thể ở mức độ thấp như C đến gần như cấp cao như Python. Thông thường nó ở giữa. Trong cả hai trường hợp, nó được gõ tĩnh, vì vậy nó không thực sự là Python.

2
Xem dự án sớm để xem mã nguồn của hàm dựng sẵn: github.com/punchagan/cinspect
Thomas

8

2 phương pháp,

  1. Bạn có thể kiểm tra việc sử dụng đoạn trích bằng cách sử dụng help()
  2. bạn có thể kiểm tra mã ẩn cho các mô-đun bằng cách sử dụng inspect

1) kiểm tra:

sử dụng mô-đun inpsect để khám phá mã bạn muốn ... LƯU Ý: bạn chỉ có thể khám phá mã cho các mô-đun (aka) gói bạn đã nhập

ví dụ:

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

2) giúp ():

bạn chỉ có thể sử dụng help()lệnh để nhận trợ giúp về các hàm dựng sẵn cũng như mã của nó.

ví dụ: nếu bạn muốn xem mã cho str (), chỉ cần gõ - help(str)

nó sẽ trở lại như thế này

>>> 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 đặc biệt muốn xem mã, trợ giúp chỉ cung cấp tài liệu.
0xc0de


1

Như được đề cập bởi @Jim, tổ chức tệp được mô tả ở đây . Tái sản xuất để dễ khám phá:

Đối với các mô-đun Python, bố cục điển hình là:

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

Đối với các mô-đun chỉ mở rộng, bố cục điển hình là:

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

Đối với các loại dựng sẵn, bố cục điển hình là:

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

Đối với các hàm dựng sẵn, bố cục điển hình là:

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

Một số trường hợp ngoại lệ:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.