組み込みのPython関数のソースコードを見つけますか?


142

組み込み関数がPythonでどのように機能するかを確認する方法はありますか?私はそれらを使用する方法だけでなく、それらがどのように構築されたか、ソートまたは列挙の背後にあるコードは何であるかなども意味します...?

回答:


135

Pythonはオープンソースであるため、ソースコードを読むことができます

特定のモジュールまたは関数が実装されているファイルを見つけるには、通常、__file__属性を出力します。または、inspectモジュールを使用することもできます。のドキュメントの「ソースコードの取得」を参照してくださいinspect

組み込みのクラスとメソッドの場合、オブジェクトが組み込みであることを示す型エラーを返すためinspect.getfile、これはそれほど単純ではありませんinspect.getsource。ただし、組み込みタイプの多くはObjects、Pythonソーストランクのサブディレクトリにあります。例えば、参照ここに列挙クラスの実装のためか、ここでの実施のためのlistタイプ。


例を挙げられenumerateますか?
ベンジャミン

OPに続いて、「ソート済み」のソースコードはどうですか?もちろん、inspect.getsourcefile(sorted)は機能しません。
ケツァルコアトル

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. ああ!参照Python/bltinmodule.c->builtin_print()

楽しい。


21

ここに画像の説明を入力してください

Built-in Functions検索で何千もの結果が得られるため、次の情報源を見つけるために少し掘り下げる必要がありました。(それらのソースがどこにあるかを見つけるためにそれらを検索して頑張ってください)

とにかく、それらのすべての関数はbltinmodule.cbuiltin_{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
user1767754

19

iPythonシェルは、これは簡単です:function?あなたのドキュメントを提供します。function??コードも示します。ただし、これは純粋なPython関数でのみ機能します。

その後、いつでも(c)Pythonのソースコードをダウンロードできます

コア機能のPython実装に興味がある場合は、PyPyソースを参照してください。


1
PyPyはほとんどの組み込みのものにRPythonを使用します。これは、Cとほぼ同じレベルからPythonとほぼ同じレベルまで可能です。通常はその中間です。どちらの場合も静的に型付けされているため、実際にはPythonではありません。

2
組み込み関数のソースコードを表示するための初期のプロジェクトを参照してください:github.com/punchagan/cinspect
Thomas

8

2つの方法、

  1. を使用してスニペットに関する使用状況を確認できます help()
  2. あなたはこれらのモジュールの隠しコードをチェックすることができます 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  --

4
OPは特にコードを確認したいので、ヘルプはドキュメントのみを提供します。
0xc0de 2018


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

組み込み型の場合、一般的なレイアウトは次のとおりです。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.