Python の関数オブジェクトの属性(__name__, __annotations__ など)
Python の関数はオブジェクトであり、さまざまな属性を持っています。これらの属性を理解すると、デバッグやメタプログラミングに役立ちます。
主要な属性
def greet(name: str, greeting: str = "Hello") -> str:
"""挨拶を返す関数"""
return f"{greeting}, {name}!"
この関数の属性を確認してみましょう。
| __name__ | 関数名("greet") |
| __doc__ | docstring("挨拶を返す関数") |
| __module__ | 定義されたモジュール名 |
| __qualname__ | 修飾名(クラス内なら "Class.method") |
| __annotations__ | 型アノテーションの辞書 |
| __defaults__ | デフォルト引数のタプル |
| __kwdefaults__ | キーワード専用引数のデフォルト |
| __code__ | コードオブジェクト |
| __globals__ | グローバル名前空間への参照 |
| __dict__ | 関数に付加された属性 |
属性の取得例
print(greet.__name__) # greet
print(greet.__doc__) # 挨拶を返す関数
print(greet.__annotations__) # {'name': <class 'str'>, ...}
print(greet.__defaults__) # ('Hello',)
code オブジェクト
コードオブジェクトには詳細な情報が含まれます。
code = greet.__code__
print(code.co_varnames) # ('name', 'greeting')
print(code.co_argcount) # 2
print(code.co_filename) # ファイル名
print(code.co_firstlineno) # 定義開始行
関数に属性を追加
関数もオブジェクトなので、任意の属性を追加できます。
def counter():
counter.count += 1
return counter.count
counter.count = 0
print(counter()) # 1
print(counter()) # 2
関数の属性を活用すると、関数の内部構造を調べたり、動的な処理を実装したりできます。