Pythonでデコレータの便利な使い方

Pythonのデコレータは多くの便利な使い方があり、コードの再利用性、保守性、可読性を向上させるために活用できます。以下は、デコレータの便利な使い方のいくつかです:

  1. ログ記録: 関数が呼び出されたときの情報を記録し、デバッグやパフォーマンスのトラブルシューティングに役立ちます。
python
def log_function_call(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with arguments {args}, {kwargs}") result = func(*args, **kwargs) print(f"{func.__name__} returned {result}") return result return wrapper @log_function_call def add(a, b): return a + b add(2, 3)
  1. 認証と認可: ユーザーの認証や認可を行い、権限の確認をするために使用します。
python
def authenticate_user(func): def wrapper(user): if user.is_authenticated: return func(user) else: return "Access denied. Please log in." return wrapper @authenticate_user def secret_data(user): return "This is secret data." authenticated_user = {"username": "Alice", "is_authenticated": True} unauthenticated_user = {"username": "Bob", "is_authenticated": False} print(secret_data(authenticated_user)) # 成功 print(secret_data(unauthenticated_user)) # アクセス拒否
  1. キャッシング: 関数の結果をキャッシュして、再計算を回避します。これはパフォーマンス向上に役立ちます。
python
import functools def memoize(func): cache = {} @functools.wraps(func) def wrapper(*args): if args in cache: return cache[args] result = func(*args) cache[args] = result return result return wrapper @memoize def fibonacci(n): if n in (0, 1): return n return fibonacci(n - 1) + fibonacci(n - 2)
  1. 引数の検証: 関数に渡される引数の妥当性を確認し、エラーチェックに役立ちます。
python
def validate_positive_args(func): def wrapper(*args): if any(arg < 0 for arg in args): raise ValueError("Arguments must be positive") return func(*args) return wrapper @validate_positive_args def divide(a, b): return a / b print(divide(10, 2)) # 正常 print(divide(10, -2)) # エラー
  1. シングルトン: クラスをシングルトンとして実装するために使用できます。同一のクラスのインスタンスを複数回生成できないようにします。
python
def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class DatabaseConnection: def __init__(self, connection_string): self.connection_string = connection_string # 複数のインスタンスを生成しても、同じインスタンスが返される db1 = DatabaseConnection("db1") db2 = DatabaseConnection("db2") print(db1 is db2) # True

これらはデコレータの便利な使い方の一部です。デコレータはコードの抽象化や機能の追加に役立つため、プロジェクトの要求に合わせてカスタムデコレータを作成することができます。