มีวิธีดูว่าฟังก์ชั่นบิวด์อินทำงานอย่างไรในไพ ธ อน? ฉันไม่ได้หมายถึงวิธีการใช้พวกเขา แต่พวกเขาสร้างอย่างไรรหัสที่อยู่เบื้องหลังการเรียงลำดับหรือการแจกแจงฯลฯ คืออะไร?
มีวิธีดูว่าฟังก์ชั่นบิวด์อินทำงานอย่างไรในไพ ธ อน? ฉันไม่ได้หมายถึงวิธีการใช้พวกเขา แต่พวกเขาสร้างอย่างไรรหัสที่อยู่เบื้องหลังการเรียงลำดับหรือการแจกแจงฯลฯ คืออะไร?
คำตอบ:
เนื่องจาก Python เป็นโอเพ่นซอร์สคุณสามารถอ่านซอร์สโค้ดได้
หากต้องการทราบว่าโมดูลหรือฟังก์ชั่นการใช้งานใดที่คุณสามารถพิมพ์แอ__file__
ททริบิวต์ได้ หรือคุณอาจใช้inspect
โมดูลดูส่วนการดึงรหัสที่มาinspect
ในเอกสารประกอบของ
สำหรับคลาสและเมธอดในตัวสิ่งนี้จะไม่ตรงไปตรงมาตั้งแต่inspect.getfile
และinspect.getsource
จะส่งคืนข้อผิดพลาดประเภทที่ระบุว่าวัตถุนั้นมีอยู่แล้วภายใน แต่หลายตัวในรูปแบบที่สามารถพบได้ในไดเรกทอรีย่อยของลำต้นแหล่งหลามObjects
ตัวอย่างเช่นดูที่นี่สำหรับการนำไปใช้งานของคลาส enumerate หรือที่นี่สำหรับการนำไปใช้งานของlist
ชนิด
sorted()
อยู่ใน/Python/bltinmodule.cแม้ว่ามันจะเพิ่งเรียกlist.sort()
ดังนั้นแหล่งที่แท้จริงอยู่ใน/Objects/listobject.c
นี่คือคำตอบของตำราอาหารเพื่อเสริม@Chris 'คำตอบ CPython ได้ย้ายไปที่ GitHub และที่เก็บ Mercurial จะไม่ได้รับการอัปเดตอีกต่อไป:
git clone https://github.com/python/cpython.git
รหัสจะชำระเงินไปยังไดเรกทอรีย่อยที่เรียกว่าcpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
สนุก.
ฉันต้องขุดเล็กน้อยเพื่อค้นหาแหล่งที่มาของสิ่งต่อไปนี้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
listobject.c
github.com/python/cpython/tree/master/Objects
IPythonเปลือกทำให้ง่ายนี้function?
จะทำให้คุณมีเอกสาร function??
แสดงรหัสด้วย แต่สิ่งนี้ใช้ได้กับฟังก์ชั่นหลามบริสุทธิ์เท่านั้น
จากนั้นคุณสามารถดาวน์โหลดซอร์สโค้ดสำหรับ (c) Python ได้ตลอดเวลา
หากคุณสนใจในการใช้งาน pythonic ของฟังก์ชั่นหลักมีลักษณะที่มาPyPy
2 วิธี
help()
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 --
ค่อนข้างเป็นทรัพยากรที่ไม่รู้จักเป็นงูหลามนักพัฒนาคู่มือ
ใน (ค่อนข้าง) GH ล่าสุดปัญหาบทใหม่ที่ถูกเพิ่มเข้ามาสำหรับเพื่อรับมือกับคำถามที่คุณถาม: CPython Source Code เค้าโครง หากสิ่งที่ควรเปลี่ยนทรัพยากรนั้นจะได้รับการปรับปรุง
ดังกล่าวโดย @ Jim องค์กรไฟล์จะถูกอธิบายไว้ที่นี่ ทำซ้ำเพื่อความสะดวกในการค้นพบ:
สำหรับโมดูล Python เลย์เอาต์ทั่วไปคือ:
Lib/<module>.py Modules/_<module>.c (if there’s 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
enumerate
?