【Python】special variablesって知ってる？

# はじめに

Pythonをデバッグしたときに出てくる `special variables`について、皆さんご存知でしょうか？ この記事では、`special variables`について、解説したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/ac0d2353-fa2a-222e-8b59-73aa3a5e2e39.png)

special variablesをクリックして、開くと[Dunder(特殊メソッド)](https://qiita.com/twrcd1227/items/e5cb450b5a225c65d12b)がいっぱい出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/abed466a-9c0d-4e78-41c3-72c99882b8b8.png)

# special variablesとは？

インタープリタやスクリプト実行時に自動で設定される特殊変数。特殊変数は全てグローバル変数になる。
関数の場合は、以下のようにfunction variables配下に関数ごとに作られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/0ab07975-c582-ff48-e98e-11cf3ab5723c.png)

インタープリタで確認する場合は、　`dir()` でグローバル変数が見れる。`globals()` でも確認できる。

```python
>>> 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__

現在のモジュール名が格納される。

```python
>>> x = 1
>>> __name__
'__main__'
```

## \_\_doc__

関数やクラスなどのドキュメントが入る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/5b674973-f154-2d8c-1549-04d61ebfebcb.png)

## \_\_package__

現在のモジュールが属するパッケージ名が入る。

## \_\_loader__

モジュールのインポートを実際に行うオブジェクト

```python
>>> import os
>>> os.__loader__
<class '_frozen_importlib.FrozenImporter'>
```

## \_\_spec__

モジュールのインポートに関するメタデータを含むオブジェクト

```python
>>> import os
>>> print(os.__spec__)
ModuleSpec(name='os', loader=<class '_frozen_importlib.FrozenImporter'>, origin='frozen')
```

## \_\_file__

実行中のファイルのパスが入っている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156096/f0915b30-7925-b1bd-aa8f-15a5c2d5f1e1.png)

## \_\_builtins__

`open()`や`len()`などの組み込み関数や組み込み定数を含むモジュールを表す。

```python
>>> print(__builtins__.len("Hello, world!"))  # 13
13
>>> print(dir(__builtins__))
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BaseExceptionGroup', 'BlockingIOError', 
            # ・・・・
```

また、builtinsモジュールを使用しても調べることができる。

```python
>>> import builtins
>>> print(builtins.len("Hello, world!"))
13
>>> help(builtins.open)
```

## \_\_cached__

キャッシュが使われている際に格納される。一般的には、ファイルオプション。

# 終わりに

この記事では、グローバル変数を定義したときに、自動でつけられる最低限の特殊変数のみをあげました。関数の特殊変数には、さらに多くのDunder(特殊メソッド)がついてきます。

Dunderの説明は以下の記事を参照にしてください。

https://qiita.com/twrcd1227/items/e5cb450b5a225c65d12b

# 参考文献

1. [【Python中・上級者向け】Dunderとは？ #Python - Qiita](https://qiita.com/twrcd1227/items/e5cb450b5a225c65d12b)
2. [The import system — Python 3.12.4 documentation](https://docs.python.org/3/reference/import.html)
3. [pythonのimportシステム周りのことについてのメモ、あるいはimport fooとしたときに何が起きるかについて - podhmo's diary](https://pod.hatenablog.com/entry/2019/07/25/005334)