はじめに
Pythonをデバッグしたときに出てくる special variables
について、皆さんご存知でしょうか? この記事では、special variables
について、解説したいと思います。
special variablesをクリックして、開くとDunder(特殊メソッド)がいっぱい出てきます。
special variablesとは?
インタープリタやスクリプト実行時に自動で設定される特殊変数。特殊変数は全てグローバル変数になる。
関数の場合は、以下のようにfunction variables配下に関数ごとに作られる。
インタープリタで確認する場合は、 dir()
でグローバル変数が見れる。globals()
でも確認できる。
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>}
>>> globals().items()
dict_items([('__name__', '__main__'), ('__doc__', None), ('__package__', None), ('__loader__', <class '_frozen_importlib.BuiltinImporter'>), ('__spec__', None), ('__annotations__', {}), ('__builtins__', <module 'builtins' (built-in)>)])
特殊変数の種類
__name__
現在のモジュール名が格納される。
>>> x = 1
>>> __name__
'__main__'
__doc__
関数やクラスなどのドキュメントが入る。
__package__
現在のモジュールが属するパッケージ名が入る。
__loader__
モジュールのインポートを実際に行うオブジェクト
>>> import os
>>> os.__loader__
<class '_frozen_importlib.FrozenImporter'>
__spec__
モジュールのインポートに関するメタデータを含むオブジェクト
>>> import os
>>> print(os.__spec__)
ModuleSpec(name='os', loader=<class '_frozen_importlib.FrozenImporter'>, origin='frozen')
__file__
実行中のファイルのパスが入っている。
__builtins__
open()
やlen()
などの組み込み関数や組み込み定数を含むモジュールを表す。
>>> print(__builtins__.len("Hello, world!")) # 13
13
>>> print(dir(__builtins__))
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BaseExceptionGroup', 'BlockingIOError',
# ・・・・
また、builtinsモジュールを使用しても調べることができる。
>>> import builtins
>>> print(builtins.len("Hello, world!"))
13
>>> help(builtins.open)
__cached__
キャッシュが使われている際に格納される。一般的には、ファイルオプション。
終わりに
この記事では、グローバル変数を定義したときに、自動でつけられる最低限の特殊変数のみをあげました。関数の特殊変数には、さらに多くのDunder(特殊メソッド)がついてきます。
Dunderの説明は以下の記事を参照にしてください。