note.nkmk.me

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

Date: 2019-05-27 / tags: Python

Pythonには多くの組み込み関数(Built-in Functions)や組み込み定数(Built-in Constants)などがある。

ここでは、組み込み関数や組み込み定数など組み込みオブジェクトの一覧を確認する方法として以下の内容を説明する。

  • 公式ドキュメントで確認
  • builtinsモジュールと__builtins__
  • 組み込み関数dir()で確認
スポンサーリンク

公式ドキュメントで確認

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

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

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

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

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

多くの実装では、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

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

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事