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
関数の属性を活用すると、関数の内部構造を調べたり、動的な処理を実装したりできます。