Pythonのデコレータの戻り値条件は、そうでない場合はリターン機能を満たしている場合

user7692855:

私は、単純なPythonのデコレータを作成するために探していますが、私は確かに私はそれを最も効率的な方法を実装していないのです。私は装飾しています機能は車の登録を返しますが、私はいつもテスト登録を返すことができるようにしたいです。

私は署名を飾っていたクラスメソッドは次のとおりです。

def get_car_registration(self, car_details)

これはデコレータの私の現在の試みです。それを行うには、より効率的な方法はあります。

from functools import wraps


def mock_registration(func):

    @wraps(func)
    def wrapper(*args, **kwargs):
        pargs = list(args)
        class_obj = pargs[0]
        car_details = pargs[1]
        if class_obj.test and car_details.car_name.startswith('test_demo'):
            return 0
        return func(*args, **kwargs)
    return wrapper
z
schwobaseggl:

署名が予め分かっている場合は、それを使用する必要があります。明示的、暗黙よりも優れています

def mock_registration(func):    
    @wraps(func)
    def wrapper(obj, car_details):
        if obj.test and car_details.car_name.startswith('test_demo'):
            return 0
        return func(obj, car_details)
    return wrapper

あなたと同じ署名機能が異なるものを返す場合は、別のデフォルトの戻り値を渡すパラメータ設定デコレータを作ることにしたかもしれません。

def mock_registration(default=0):
    def decorator(func):        
        @wraps(func)
        def wrapper(obj, car_details):
            if obj.test and car_details.car_name.startswith('test_demo'):
                return default
            return func(obj, car_details)
        return wrapper
    return decorator

そして、方法を飾ります:

@mock_registration()
def get_car_registration(self, car_details):
    # ....

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=383812&siteId=1