Pythonの組み込み関数の一覧を確認するdir(__builtins__)

Modified: | Tags: Python

Pythonには組み込み関数(Built-in Functions)や組み込み定数(Built-in Constants)など、多くの組み込みオブジェクトがある。

ここでは、組み込み関数などの一覧を確認する方法を説明する。

組み込み関数などの一覧を公式ドキュメントで確認

公式ドキュメントの該当部分は以下の通り。

勉強のためにどのような組み込み関数があるのかを知りたい、という目的であれば公式ドキュメントを見るのが一番いい。

左上のセレクトボックスで表示言語やPythonのバージョンを選択できるようになっている。

builtinsモジュールと__builtins__

組み込み関数などの組み込みオブジェクトにアクセスするためのモジュールとして、標準ライブラリにbuiltinsモジュールがある。

builtinsモジュールをインポートすると、例えば組み込み関数len()builtins.len()として呼び出せる。この2つは同じオブジェクト。

import builtins

print(len('abc'))
# 3

print(builtins.len('abc'))
# 3

print(len)
# <built-in function len>

print(builtins.len)
# <built-in function len>

print(builtins.len is len)
# True

一般的にはわざわざbuiltinsモジュールを使うことはないが、組み込み関数をラップした同名の関数を実装したいときなどに使う。詳細は以下の公式ドキュメントを参照。

多くの実装では、builtinsモジュールをインポートしなくても__builtins__でbuiltinsモジュールを使えるようになっている。

print(__builtins__.len('abc'))
# 3

print(__builtins__.len is len)
# True

print(__builtins__ is builtins)
# True

組み込み関数などの一覧をdir()で確認

組み込み関数dir()は引数に指定したオブジェクトの属性やメソッドなどの名前のリストを返す関数。

dir()の引数に上述のbuiltinsモジュールまたは__builtins__を指定することで、組み込み関数や組み込み定数など、組み込みオブジェクトの名前のリストが取得できる。

ここでは出力を見やすくするためにpprintを使っている。

なお、__builtins__がbuiltinsモジュールと異なる環境では、dir(__builtins__)ではなくbuiltinsモジュールをインポートしてdir(builtins)とすればよい。

import pprint

print(type(dir(__builtins__)))
# <class 'list'>

print(len(dir(__builtins__)))
# 153

pprint.pprint(dir(__builtins__), compact=True)
# ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
#  'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
#  'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
#  'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
#  'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
#  'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning',
#  'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError',
#  'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError',
#  'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError',
#  'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
#  'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning',
#  'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError',
#  'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration',
#  'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit',
#  'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError',
#  'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError',
#  'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError',
#  'Warning', 'ZeroDivisionError', '__IPYTHON__', '__build_class__', '__debug__',
#  '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__',
#  'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray',
#  'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright',
#  'credits', 'delattr', 'dict', 'dir', 'display', 'divmod', 'enumerate', 'eval',
#  'exec', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr',
#  'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int',
#  'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map',
#  'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
#  'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr',
#  'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
#  'vars', 'zip']

この結果は環境やバージョンによって異なる。上の例の出力はJupyter Notebook(IPython)での実行結果なので'__IPYTHON__''get_ipython'などの値が含まれている。

dir()が返すのは名前の文字列のリスト。それぞれの名前が関数なのか定数なのかといった情報は含まれていない。

print(dir(__builtins__)[0])
# ArithmeticError

print(type(dir(__builtins__)[0]))
# <class 'str'>

リスト内包表記と文字列メソッドを組み合わせることで、小文字かつ'_'で始まらないもののみを抽出したり、'Error''Warning'で終わるもののみを抽出したりできる。

pprint.pprint([s for s in dir(__builtins__) if s.islower() and not s.startswith('_')], compact=True)
# ['abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray',
#  'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright',
#  'credits', 'delattr', 'dict', 'dir', 'display', 'divmod', 'enumerate', 'eval',
#  'exec', 'filter', 'float', 'format', 'frozenset', 'get_ipython', 'getattr',
#  'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int',
#  'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map',
#  'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow',
#  'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr',
#  'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
#  'vars', 'zip']

pprint.pprint([s for s in dir(__builtins__) if s.endswith('Error')], compact=True)
# ['ArithmeticError', 'AssertionError', 'AttributeError', 'BlockingIOError',
#  'BrokenPipeError', 'BufferError', 'ChildProcessError',
#  'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError',
#  'ConnectionResetError', 'EOFError', 'EnvironmentError', 'FileExistsError',
#  'FileNotFoundError', 'FloatingPointError', 'IOError', 'ImportError',
#  'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError',
#  'KeyError', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError',
#  'NotADirectoryError', 'NotImplementedError', 'OSError', 'OverflowError',
#  'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError',
#  'RuntimeError', 'SyntaxError', 'SystemError', 'TabError', 'TimeoutError',
#  'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
#  'UnicodeError', 'UnicodeTranslateError', 'ValueError', 'ZeroDivisionError']

pprint.pprint([s for s in dir(__builtins__) if s.endswith('Warning')], compact=True)
# ['BytesWarning', 'DeprecationWarning', 'FutureWarning', 'ImportWarning',
#  'PendingDeprecationWarning', 'ResourceWarning', 'RuntimeWarning',
#  'SyntaxWarning', 'UnicodeWarning', 'UserWarning', 'Warning']

上述のように、単にPythonにどのような組み込み関数があるのかを知りたいという目的であれば公式ドキュメントを見ればいいが、ある文字列が組み込みオブジェクトとして使われているか確認したい、という場合はdir(__builtins__)が便利。

以下のように確認できる。

print('len' in dir(__builtins__))
# True

組み込みオブジェクトと同じ名前を変数名などとして使うと内容が上書きされてしまうので避けたほうがよい。

関連カテゴリー

関連記事