Pythonの組み込み関数の一覧を確認するdir(__builtins__)
Pythonには組み込み関数(Built-in Functions)や組み込み定数(Built-in Constants)など、多くの組み込みオブジェクトがある。
ここでは、組み込み関数などの一覧を確認する方法を説明する。
組み込み関数などの一覧を公式ドキュメントで確認
公式ドキュメントの該当部分は以下の通り。
勉強のためにどのような組み込み関数があるのかを知りたい、という目的であれば公式ドキュメントを見るのが一番いい。
- 組み込み関数 — Python 3.12.0 ドキュメント
- 組み込み型 — Python 3.12.0 ドキュメント
- 組み込み定数 — Python 3.12.0 ドキュメント
- 組み込み例外 — Python 3.12.0 ドキュメント
左上のセレクトボックスで表示言語や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'
で終わるもののみを抽出したりできる。
- 関連記事: Pythonリスト内包表記の使い方
- 関連記事: Pythonで大文字・小文字を操作する文字列メソッド一覧
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
組み込みオブジェクトと同じ名前を変数名などとして使うと内容が上書きされてしまうので避けたほうがよい。