web-dev-qa-db-ja.com

組み込み関数と呼ばれる標準ライブラリモジュールの関数はいつですか?

「組み込み」機能という用語について混乱しています。インタプリタに組み込まれ、文書化された関数のみを意味すると思った- 2。組み込み関数
しかし、標準ライブラリモジュールで定義された関数も組み込み関数のようです(場合によっては)。例えば ​​-

>>> import os
>>> os.chdir
<built-in function chdir>
>>> import warnings
>>> warnings.warn
<built-in function warn>
>>> import json
>>> json.dumps
<function dumps at 0x7f3643a240d0> # not built-in
>>> dir
<built-in function dir>
>>> 

では、標準ライブラリモジュールの関数が組み込み関数と呼ばれるのはいつですか?

27
debashish

ここで「組み込み」には2つの意味がありますが、どちらも「インタプリタの一部」を意味します。ライブラリリファレンスはこれを使用して、importなしで関数を使用できることを示します(「 builtins を参照してくださいが、「モジュールの一部ではありません」)。インタプリタ自体はこれを使用して、関数がPythonではなくネイティブに実装されていることを示します(CPythonでは、少なくとも名目上は Cで実装されています ))。

C側にはさらに別の意味があります。拡張モジュール(ie、Cで記述されたもの)は、Pythonバイナリは、必要に応じてロードするのではなく、それを組み込んでいます。

23
Davis Herring

Luciano Ramalho著の本(Fluent Python)、第1版第3リリース2016-03-18、O'Reilly発行、ページで読む742:

用語[i。 e。 「組み込み関数」]は、インポートする必要のない関数のみを指します。しかし、sys、math、reなどの組み込みモジュールには、組み込み関数も含まれています。

全体として、この用語は一貫して使用されていないようです。しかし、実際には、これは重要ではありません。」

4
user9611000

リファレンスマニュアル による組み込み関数は次のとおりです。

組み込み関数

組み込み関数オブジェクトは、C関数のラッパーです。組み込み関数の例は、len()およびmath.sin()です(mathは標準の組み込みモジュールです)。引数の数とタイプは、C関数によって決定されます。特別な読み取り専用属性:__doc__は関数の説明文字列です。使用できない場合はNoneです。 __name__は関数の名前です。 __self__はNoneに設定されています(ただし、次の項目を参照してください)。 __module__は、関数が定義されたモジュールの名前、または使用できない場合はNoneです。

これはCPythonを指し、Jythonなどの他の実装では、Cの代わりにJavaを使用して組み込みを実装します。


標準ライブラリのセクション 組み込み関数について は、常に利用可能なものについて話しています。これは 組み込み定数 および 組み込み型 とともに、常にアクセスできる識別子の組み込み名前空間を形成します。

この組み込み名前空間のすべてが組み込み関数または組み込み型であるとは限りません。注目すべきケースは helpquit/exit

まあ、この定義から、それが組み込みであると言うとき、関数は組み込みです;)

もっと真剣に:Pythonは言語(これを「法的」部分と呼びましょう)であり、CPythonはPython言語の唯一の実装ではありません) (これを「テクニカル」パーツと呼びましょう)。

有効なPOVから、言語の定義では、実装は一部の関数(およびクラスとオブジェクト)をインポートなしで使用可能にする必要があると述べています(IOWには言語自体が「組み込まれています」)。これは、Pythonのドキュメントで「組み込み」と定義されているものです。

技術的なPOVから、これは実装が他のいくつかの関数/オブジェクト/クラスを「技術的に」組み込み(技術的にはランタイムの一部であるため)することを妨げませんが、stdlibのモジュールまたはパッケージの一部として公開されます。

3