少ない労力でより多くのことを実現する、シンプルだけど非常に便利な Python デコレータ 10 個

デコレータは、関数やクラスの動作を変更または強化するための Python の強力で柔軟な機能です。デコレータは本質的に、別の関数またはクラスを引数として受け取り、新しい関数またはクラスを返す関数です。これらは、元のコードを変更せずに追加の機能や機能を追加するためによく使用されます。

デコレータ構文では、@シンボルを使用してデコレータをターゲット関数またはクラスに適用します。以下に、非常にシンプルだが便利なカスタム デコレータを 10 個紹介します。

技術交流

テクノロジーは共有とコミュニケーションを学ぶ必要があり、密室で作業することはお勧めできません。1 人で速く進むこともできますし、グループでより遠くまで進むこともできます。

関連するファイルとコードがアップロードされており、コミュニケーション グループに追加することで入手できます。グループには 2,000 人以上のメンバーがいます。メモを追加する最良の方法は、ソース + 興味の方向です。これにより、同じ考えを持つ人を見つけるのに便利です友達。

方法①、WeChatアカウントを追加:dkl88194、備考:CSDNから+グループを追加
方法②、WeChat検索公式アカウント:Python学習とデータマイニング、バックグラウンド返信:グループを追加

@timer: 実行時間を測定します

コードのパフォーマンスを最適化することは非常に重要です。@timer デコレーターは、特定の関数の実行時間を追跡するのに役立ちます。このデコレータで関数をラップすることで、ボトルネックをすばやく特定し、コードの重要な部分を最適化できます。仕組みは次のとおりです。

 import time
 
 def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{
      
      func.__name__} took {
      
      end_time - start_time:.2f} seconds to execute.")
        return result
    return wrapper
 @timer
 def my_data_processing_function():
    # Your data processing code here

@timer を他のデコレータと組み合わせて、コードのパフォーマンスを包括的に分析します。

@memoize: 結果をキャッシュします

データ サイエンスでは、計算コストのかかる関数を扱うことがよくあります。@memoize デコレーターは関数の結果をキャッシュするのに役立ち、同じ入力に対する冗長な計算を回避し、ワークフローを大幅に高速化しました。

 def memoize(func):
    cache = {
    
    }
 
 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 <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

再帰関数で @memoize を使用して、繰り返される計算を最適化することもできます。

@validate_input データ検証

データの整合性は重要であり、@validate_input デコレーターは関数の引数を検証し、計算を続行する前に特定の基準を満たしていることを確認できます。

 def validate_input(func):
    def wrapper(*args, **kwargs):
        # Your data validation logic here
        if valid_data:
            return func(*args, **kwargs)
        else:
            raise ValueError("Invalid data. Please check your inputs.")
 
 return wrapper
 @validate_input
 def analyze_data(data):
    # Your data analysis code here

データ サイエンス プロジェクトでデータ検証を一貫して実装するには @validate_input を使用すると便利です。

@log_results: ログ出力

複雑なデータ分析を実行する場合、各関数の出力を追跡することが重要になります。@log_results デコレータは、関数の結果をログに記録してデバッグと監視を容易にするのに役立ちます。

 def log_results(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        with open("results.log", "a") as log_file:
            log_file.write(f"{
      
      func.__name__} - Result: {
      
      result}\n")
        return result
 
 return wrapper
 @log_results
 def calculate_metrics(data):
    # Your metric calculation code here

より高度なログ機能を得るには、@log_results をログ ライブラリと組み合わせて使用​​します。

stop_errors: 適切なエラー処理

データ サイエンス プロジェクトでは、計算パイプライン全体を混乱させる可能性のある予期せぬエラーが発生することがよくあります。@suppress_errors デコレータは例外を適切に処理し、実行を継続します。

 def suppress_errors(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print(f"Error in {
      
      func.__name__}: {
      
      e}")
            return None
 
 return wrapper
 @suppress_errors
 def preprocess_data(data):
    # Your data preprocessing code here

@suppress_errors を使用すると、重大なエラーの隠蔽を回避でき、デバッグを容易にするために詳細なエラーを出力することもできます。

データ分析の品質を確保することが重要です。@validate_output デコレーターは、関数の出力を検証するのに役立ち、さらに処理する前に関数の出力が特定の基準を満たしていることを確認します。

 def validate_output(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        if valid_output(result):
            return result
        else:
            raise ValueError("Invalid output. Please check your function logic.")
 
 return wrapper
 @validate_output
 def clean_data(data):
    # Your data cleaning code here

これにより、検証関数の出力に対して明確に定義された基準を常に定義できます。

@retry: 実行を再試行します

@retry デコレータは、例外が発生したときに関数の実行を再試行するのに役立ち、より高い回復力を確保します。

 import time
 
 def retry(max_attempts, delay):
    def decorator(func):
        def wrapper(*args, **kwargs):
            attempts = 0
            while attempts < max_attempts:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {
      
      attempts + 1} failed. Retrying in {
      
      delay} seconds.")
                    attempts += 1
                    time.sleep(delay)
            raise Exception("Max retry attempts exceeded.")
        return wrapper
    return decorator
 @retry(max_attempts=3, delay=2)
 def fetch_data_from_api(api_url):
    # Your API data fetching code here

@retry を使用する場合は、過剰な再試行を避ける必要があります。

@visualize_results: 美しいビジュアライゼーション

@visualize_results デコレータ データ分析で美しい視覚化結果を自動的に生成

 import matplotlib.pyplot as plt
 
 def visualize_results(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        plt.figure()
        # Your visualization code here
        plt.show()
        return result
    return wrapper
 @visualize_results
 def analyze_and_visualize(data):
    # Your combined analysis and visualization code here

@debug: デバッグが簡単になりました

複雑なコードのデバッグには時間がかかる場合があります。@debug デコレーターは、デバッグを容易にするために関数の入力パラメーターとその値を出力できます。

 def debug(func):
    def wrapper(*args, **kwargs):
        print(f"Debugging {
      
      func.__name__} - args: {
      
      args}, kwargs: {
      
      kwargs}")
        return func(*args, **kwargs)
 
 return wrapper
 @debug
 def complex_data_processing(data, threshold=0.5):
    # Your complex data processing code here

@deprecated: 非推奨の関数を処理します

プロジェクトが繰り返されるにつれて、一部の機能が廃止される可能性があります。@deprecated デコレーターは、関数が推奨されなくなったときにユーザーに通知できます。

 import warnings
 
 def deprecated(func):
    def wrapper(*args, **kwargs):
        warnings.warn(f"{
      
      func.__name__} is deprecated and will be removed in future versions.", DeprecationWarning)
        return func(*args, **kwargs)
    return wrapper
 @deprecated
 def old_data_processing(data):
    # Your old data processing code here

要約する

デコレータは Python で非常に強力で一般的に使用される機能で、キャッシュ、ロギング、権限制御など、さまざまな状況で使用できます。プロジェクトで導入したこれらの Python デコレーターを使用すると、開発プロセスを簡素化したり、コードをより堅牢にしたりできます。

おすすめ

転載: blog.csdn.net/qq_34160248/article/details/132664850