Pythonで組み込み関数がどのように機能するかを確認する方法はありますか?私はそれらをどのように使用するかだけでなく、どのように構築されたか、sortedの背後にあるコードは何ですか? enumerate etc ...?
Pythonはオープンソースなので、 ソースコード を読むことができます。
特定のモジュールまたは機能がどのファイルに実装されているかを調べるには、通常__file__
属性を印刷します。または、inspect
モジュールを使用することもできます。inspect
のドキュメントのセクション Retrieving Source Code を参照してください。
inspect.getfile
およびinspect.getsource
はオブジェクトが組み込みであることを示す型エラーを返すため、組み込みのクラスおよびメソッドの場合、これはそれほど単純ではありません。ただし、組み込みタイプの多くは、 Pythonソーストランクのサブディレクトリの[Objects
] にあります。たとえば、列挙クラスの実装については here を、list
型の実装については here を参照してください。
@ Chris 'answer を補足するクックブックの回答を次に示します。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
2つの方法、
help()
を使用してスニペットに関する使用状況を確認できますinspect
を使用して、これらのモジュールの非表示コードを確認できます1)inspect:
inpsectモジュールを使用して、必要なコードを探索します... 注:インポートしたモジュール(別名)パッケージのコードのみを探索できます
例えば:
>>> import randint
>>> from inspect import getsource
>>> getsource(randint) # here i am going to explore code for package called `randint`
2)help():
単に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 --
かなり未知のリソースはPython 開発者ガイド です。
(やや)最近のGH issue で、あなたが尋ねている質問に対処するための新しい章が追加されました: CPython Source Code Layout 。何かが変更されると、そのリソースも更新されます。
@Jimが述べたように、ファイル編成は here で記述されています。発見を容易にするために再現:
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
組み込み型の場合、一般的なレイアウトは次のとおりです。
Objects/<builtin>object.c Lib/test/test_<builtin>.py Doc/library/stdtypes.rst
組み込み関数の場合、一般的なレイアウトは次のとおりです。
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