Python〜デコレーターの使い方

スポンサーリンク

バイオインフォマティクスの分野でPython3は、データ解析、アルゴリズム開発、可視化など、幅広い用途で活用されています。その中で「デコレーター」は、高度なコードの再利用性や保守性を実現するための重要な機能です。

本記事では、Python3のデコレーター機能について基本から応用までを解説し、バイオインフォマティクスにおける活用例もご紹介します。


デコレーターとは?

デコレーターは、Pythonの関数やクラスの振る舞いを簡単に変更できる機能です。主に以下の目的で使用されます:

  • コードの簡潔化
  • 再利用性の向上
  • 関数の前後に特定の処理を挿入

デコレーターは関数を引数として受け取り、処理を施して新しい関数を返します。Pythonでは「@デコレーター名」を使って簡単に適用できます。

基本的な構文

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        print(f"{original_function.__name__}が実行されます")
        return original_function(*args, **kwargs)
    return wrapper_function

@decorator_function
def sample_function():
    print("サンプル関数が実行されました")

sample_function()

この例では、sample_functionの実行前に「関数が実行されます」というメッセージが表示されます。


応用:デコレーターの実践例

1. 実行時間の計測

バイオインフォマティクスでは、大量のデータを扱う関数の実行時間を計測することがよくあります。デコレーターを使うと効率的に計測が可能です。

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__}の実行時間: {end_time - start_time:.2f}秒")
        return result
    return wrapper

@timing_decorator
def analyze_sequence(sequence):
    # 仮のシミュレーション処理
    time.sleep(2)
    return f"{sequence}の解析結果"

print(analyze_sequence("ATCGATCG"))

2. 入力データの検証

データ解析では、関数の入力データを検証する必要があります。デコレーターを使うと、全ての関数で同じ検証ロジックを適用できます。

def validate_sequence(func):
    def wrapper(sequence, *args, **kwargs):
        if not set(sequence).issubset({"A", "T", "C", "G"}):
            raise ValueError("無効なDNAシーケンスです")
        return func(sequence, *args, **kwargs)
    return wrapper

@validate_sequence
def process_sequence(sequence):
    return f"{sequence}を処理中..."

# 有効な入力
print(process_sequence("ATCG"))
# 無効な入力
# print(process_sequence("ATXG"))

3. ログの記録

解析結果やエラーを記録することで、後でデバッグしやすくなります。デコレーターを活用して自動的にログを残す仕組みを作ることが可能です。

def log_decorator(func):
    def wrapper(*args, **kwargs):
        with open("function_log.txt", "a") as log_file:
            log_file.write(f"{func.__name__}が呼び出されました\n")
        return func(*args, **kwargs)
    return wrapper

@log_decorator
def compute_gc_content(sequence):
    gc_count = sequence.count("G") + sequence.count("C")
    return gc_count / len(sequence) * 100

print(compute_gc_content("ATGCGC"))

応用例:バイオインフォマティクスでの活用

デコレーターは、特にパイプライン処理やデータ検証に役立ちます。たとえば、ゲノム解析のワークフローで以下のように活用できます:

1. 複数の解析ステップに共通の処理を追加

def workflow_logger(func):
    def wrapper(*args, **kwargs):
        print(f"ステップ開始: {func.__name__}")
        result = func(*args, **kwargs)
        print(f"ステップ終了: {func.__name__}")
        return result
    return wrapper

@workflow_logger
def step_1(sequence):
    return sequence.lower()

@workflow_logger
def step_2(sequence):
    return sequence[::-1]

sequence = "ATCGATCG"
result = step_2(step_1(sequence))
print(result)

2. エラー処理の簡素化

デコレーターを使って、関数のエラー処理を一元化できます。

def error_handler(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"エラー発生: {e}")
    return wrapper

@error_handler
def risky_function(sequence):
    if len(sequence) < 10:
        raise ValueError("シーケンスが短すぎます")
    return f"正常に処理されました: {sequence}"

print(risky_function("ATCG"))

まとめ

Python3のデコレーター機能は、バイオインフォマティクスにおけるコードの効率化に欠かせないツールです。実行時間の計測、データ検証、ログ記録など、さまざまな用途で活用できます。本記事で紹介した例を参考に、バイオインフォマティクスのプロジェクトでデコレーターをどんどん応用してみてくださいね〜!

タイトルとURLをコピーしました