1. ホーム
  2. python

[解決済み] パラメータを持つデコレータ?

2022-03-17 13:01:42

質問

デコレーターによる変数'insurance_mode'の転送に問題があります。以下のようなデコレータ文によって行いたいのですが。

@execute_complete_reservation(True)
def test_booking_gta_object(self):
    self.test_select_gta_object()

が、残念ながらこの文ではうまくいきません。もしかしたら、この問題を解決する良い方法があるかもしれません。

def execute_complete_reservation(test_case,insurance_mode):
    def inner_function(self,*args,**kwargs):
        self.test_create_qsf_query()
        test_case(self,*args,**kwargs)
        self.test_select_room_option()
        if insurance_mode:
            self.test_accept_insurance_crosseling()
        else:
            self.test_decline_insurance_crosseling()
        self.test_configure_pax_details()
        self.test_configure_payer_details

    return inner_function

解決方法は?

引数つきのデコレータの構文は少し異なります - 引数つきのデコレータは、以下のような関数を返す必要があります。 関数を取る を実行し、別の関数を返します。だから、本当は普通のデコレータを返すべきなんだ。ちょっとわかりにくいですよね?私が言いたいのは

def decorator_factory(argument):
    def decorator(function):
        def wrapper(*args, **kwargs):
            funny_stuff()
            something_with_argument(argument)
            result = function(*args, **kwargs)
            more_funny_stuff()
            return result
        return wrapper
    return decorator

これ 呼び出し可能なオブジェクトを使用して実装することも可能で、それについてもこのページで説明しています。