組み込み関数がPythonでどのように機能するかを確認する方法はありますか?私はそれらを使用する方法だけでなく、それらがどのように構築されたか、ソートまたは列挙の背後にあるコードは何であるかなども意味します...?
組み込み関数がPythonでどのように機能するかを確認する方法はありますか?私はそれらを使用する方法だけでなく、それらがどのように構築されたか、ソートまたは列挙の背後にあるコードは何であるかなども意味します...?
回答:
Pythonはオープンソースであるため、ソースコードを読むことができます。
特定のモジュールまたは関数が実装されているファイルを見つけるには、通常、__file__
属性を出力します。または、inspect
モジュールを使用することもできます。のドキュメントの「ソースコードの取得」を参照してくださいinspect
。
組み込みのクラスとメソッドの場合、オブジェクトが組み込みであることを示す型エラーを返すためinspect.getfile
、これはそれほど単純ではありませんinspect.getsource
。ただし、組み込みタイプの多くはObjects
、Pythonソーストランクのサブディレクトリにあります。例えば、参照ここに列挙クラスの実装のためか、ここでの実施のための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??
コードも示します。ただし、これは純粋なPython関数でのみ機能します。
その後、いつでも(c)Pythonのソースコードをダウンロードできます。
コア機能のPython実装に興味がある場合は、PyPyソースを参照してください。
2つの方法、
help()
inspect
1)検査:
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の問題で、あなたが尋ねている質問に対処するための新しい章が追加されました:CPythonソースコードレイアウト。何か変更が必要な場合、そのリソースも更新されます。
@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
組み込み型の場合、一般的なレイアウトは次のとおりです。
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
enumerate
ますか?