web-dev-qa-db-ja.com

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

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

107
user1073865

Pythonはオープンソースなので、 ソースコード を読むことができます。

特定のモジュールまたは機能がどのファイルに実装されているかを調べるには、通常__file__属性を印刷します。または、inspectモジュールを使用することもできます。inspectのドキュメントのセクション Retrieving Source Code を参照してください。

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

107
Chris

@ Chris 'answer を補足するクックブックの回答を次に示します。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()を参照してください

楽しい。

30
kevinarpe

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

そうすれば、常に ダウンロード (c)Pythonのソースコードを使用できます。

コア機能のPythonic実装に興味がある場合は、 PyPy sourceをご覧ください。

17
tback

enter image description here

検索で数千の結果が得られるため、次の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

13
user1767754

2つの方法、

  1. help()を使用してスニペットに関する使用状況を確認できます
  2. 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
0
Mateen Ulhaq