ค้นหารหัสต้นฉบับสำหรับฟังก์ชั่น Python ในตัวหรือไม่


142

มีวิธีดูว่าฟังก์ชั่นบิวด์อินทำงานอย่างไรในไพ ธ อน? ฉันไม่ได้หมายถึงวิธีการใช้พวกเขา แต่พวกเขาสร้างอย่างไรรหัสที่อยู่เบื้องหลังการเรียงลำดับหรือการแจกแจงฯลฯ คืออะไร?

คำตอบ:


135

เนื่องจาก Python เป็นโอเพ่นซอร์สคุณสามารถอ่านซอร์สโค้ดได้

หากต้องการทราบว่าโมดูลหรือฟังก์ชั่นการใช้งานใดที่คุณสามารถพิมพ์แอ__file__ททริบิวต์ได้ หรือคุณอาจใช้inspectโมดูลดูส่วนการดึงรหัสที่มาinspectในเอกสารประกอบของ

สำหรับคลาสและเมธอดในตัวสิ่งนี้จะไม่ตรงไปตรงมาตั้งแต่inspect.getfileและinspect.getsourceจะส่งคืนข้อผิดพลาดประเภทที่ระบุว่าวัตถุนั้นมีอยู่แล้วภายใน แต่หลายตัวในรูปแบบที่สามารถพบได้ในไดเรกทอรีย่อยของลำต้นแหล่งหลามObjects ตัวอย่างเช่นดูที่นี่สำหรับการนำไปใช้งานของคลาส enumerate หรือที่นี่สำหรับการนำไปใช้งานของlistชนิด


คุณสามารถยกตัวอย่างด้วยenumerate?
เบนจามิน

ติดตาม OP, วิธีการเกี่ยวกับรหัสที่มาสำหรับ "เรียงลำดับ"? แน่นอน inspect.getsourcefile (เรียงลำดับ) ไม่ทำงาน
Quetzalcoatl

2
@Quetzalcoatl ซอร์สโค้ดสำหรับsorted()อยู่ใน/Python/bltinmodule.cแม้ว่ามันจะเพิ่งเรียกlist.sort()ดังนั้นแหล่งที่แท้จริงอยู่ใน/Objects/listobject.c
Boris

35

นี่คือคำตอบของตำราอาหารเพื่อเสริม@Chris 'คำตอบ CPython ได้ย้ายไปที่ GitHub และที่เก็บ Mercurial จะไม่ได้รับการอัปเดตอีกต่อไป:

  1. ติดตั้ง Git ถ้าจำเป็น
  2. git clone https://github.com/python/cpython.git

  3. รหัสจะชำระเงินไปยังไดเรกทอรีย่อยที่เรียกว่าcpython->cd cpython

  4. สมมติว่าเรากำลังมองหาคำจำกัดความของprint()...
  5. egrep --color=always -R 'print' | less -R
  6. Aha! ดูPython/bltinmodule.c->builtin_print()

สนุก.


22

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องขุดเล็กน้อยเพื่อค้นหาแหล่งที่มาของสิ่งต่อไปนี้Built-in Functionsเนื่องจากการค้นหาจะให้ผลลัพธ์หลายพันรายการ (ขอให้โชคดีในการค้นหาผู้ที่จะหาที่มาของมัน)

อย่างไรก็ตามฟังก์ชั่นเหล่านั้นทั้งหมดจะถูกกำหนดในbltinmodule.cฟังก์ชั่นเริ่มต้นbuiltin_{functionname}

แหล่งที่มาในตัว: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

สำหรับประเภทในตัว: https://github.com/python/cpython/tree/master/Objects


1
รายการเป็นวัตถุ / ประเภทไม่ใช่ฟังก์ชันในตัว คุณสามารถค้นหารายละเอียดการใช้งานได้ในlistobject.c github.com/python/cpython/tree/master/Objects
1767754

19

IPythonเปลือกทำให้ง่ายนี้function?จะทำให้คุณมีเอกสาร function??แสดงรหัสด้วย แต่สิ่งนี้ใช้ได้กับฟังก์ชั่นหลามบริสุทธิ์เท่านั้น

จากนั้นคุณสามารถดาวน์โหลดซอร์สโค้ดสำหรับ (c) Python ได้ตลอดเวลา

หากคุณสนใจในการใช้งาน pythonic ของฟังก์ชั่นหลักมีลักษณะที่มาPyPy


1
PyPy ใช้ RPython สำหรับเนื้อหาในตัวเกือบทั้งหมดซึ่งอาจอยู่ในระดับต่ำถึง C ถึงเกือบจะสูงเท่ากับ Python มักจะอยู่ในระหว่าง ไม่ว่าในกรณีใดมันจะถูกพิมพ์แบบคงที่ดังนั้นจึงไม่ใช่ Python จริงๆ

2
ดูโครงการต้นสำหรับการดูซอร์สโค้ดของฟังก์ชัน builtin: github.com/punchagan/cinspect
Thomas

8

2 วิธี

  1. คุณสามารถตรวจสอบการใช้งานเกี่ยวกับตัวอย่างโดยใช้ help()
  2. คุณสามารถตรวจสอบรหัสที่ซ่อนสำหรับโมดูลเหล่านั้นโดยใช้ inspect

1) ตรวจสอบ:

ใช้โมดูลinpsectเพื่อสำรวจรหัสที่คุณต้องการ ... หมายเหตุ:คุณสามารถสำรวจรหัสสำหรับแพคเกจโมดูล (aka) ที่คุณนำเข้า

สำหรับเช่น:

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

2) ความช่วยเหลือ ():

คุณสามารถใช้help()คำสั่งเพื่อรับความช่วยเหลือเกี่ยวกับฟังก์ชั่นบิวด์อินและโค้ดของมัน

สำหรับเช่น: หากคุณต้องการดูรหัสสำหรับ str () เพียงพิมพ์ - help(str)

มันจะกลับมาเช่นนี้

>>> 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 ต้องการดูรหัสโดยเฉพาะช่วยให้มีเพียงเอกสารประกอบเท่านั้น
0xc0de

6

ค่อนข้างเป็นทรัพยากรที่ไม่รู้จักเป็นงูหลามนักพัฒนาคู่มือ

ใน (ค่อนข้าง) GH ล่าสุดปัญหาบทใหม่ที่ถูกเพิ่มเข้ามาสำหรับเพื่อรับมือกับคำถามที่คุณถาม: CPython Source Code เค้าโครง หากสิ่งที่ควรเปลี่ยนทรัพยากรนั้นจะได้รับการปรับปรุง


1

ดังกล่าวโดย @ Jim องค์กรไฟล์จะถูกอธิบายไว้ที่นี่ ทำซ้ำเพื่อความสะดวกในการค้นพบ:

สำหรับโมดูล Python เลย์เอาต์ทั่วไปคือ:

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

สำหรับโมดูลเฉพาะส่วนขยายเลย์เอาต์ทั่วไปคือ:

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

สำหรับชนิด builtin ชนิดเลย์เอาต์ทั่วไปคือ:

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

สำหรับฟังก์ชั่น builtin รูปแบบทั่วไปคือ:

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

ข้อยกเว้นบางประการ:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.