33import functools
44from collections .abc import Callable
55from logging import getLogger
6- from typing import Any
6+ from typing import ParamSpec , TypeVar
77
88from gokart .conflict_prevention_lock .task_lock import TaskLockParams , set_lock_scheduler , set_task_lock
99
1010logger = getLogger (__name__ )
1111
1212
13- def wrap_dump_with_lock (func : Callable , task_lock_params : TaskLockParams , exist_check : Callable ) -> Callable :
13+ P = ParamSpec ('P' )
14+ R = TypeVar ('R' )
15+
16+
17+ def wrap_dump_with_lock (func : Callable [P , R ], task_lock_params : TaskLockParams , exist_check : Callable [..., bool ]) -> Callable [P , R | None ]:
1418 """Redis lock wrapper function for TargetOnKart.dump().
1519 When TargetOnKart.dump() is called, dump() will be wrapped with redis lock and cache existance check.
1620 https://github.com/m3dev/gokart/issues/265
@@ -19,14 +23,15 @@ def wrap_dump_with_lock(func: Callable, task_lock_params: TaskLockParams, exist_
1923 if not task_lock_params .should_task_lock :
2024 return func
2125
22- def wrapper (* args , ** kwargs ) :
26+ def wrapper (* args : P . args , ** kwargs : P . kwargs ) -> R | None :
2327 task_lock = set_task_lock (task_lock_params = task_lock_params )
2428 scheduler = set_lock_scheduler (task_lock = task_lock , task_lock_params = task_lock_params )
2529
2630 try :
2731 logger .debug (f'Task DUMP lock of { task_lock_params .redis_key } locked.' )
2832 if not exist_check ():
29- func (* args , ** kwargs )
33+ return func (* args , ** kwargs )
34+ return None
3035 finally :
3136 logger .debug (f'Task DUMP lock of { task_lock_params .redis_key } released.' )
3237 task_lock .release ()
@@ -35,7 +40,7 @@ def wrapper(*args, **kwargs):
3540 return wrapper
3641
3742
38- def wrap_load_with_lock (func : Callable , task_lock_params : TaskLockParams ) -> Callable :
43+ def wrap_load_with_lock (func : Callable [ P , R ], task_lock_params : TaskLockParams ) -> Callable [ P , R ] :
3944 """Redis lock wrapper function for TargetOnKart.load().
4045 When TargetOnKart.load() is called, redis lock will be locked and released before load().
4146 https://github.com/m3dev/gokart/issues/265
@@ -44,7 +49,7 @@ def wrap_load_with_lock(func: Callable, task_lock_params: TaskLockParams) -> Cal
4449 if not task_lock_params .should_task_lock :
4550 return func
4651
47- def wrapper (* args , ** kwargs ) :
52+ def wrapper (* args : P . args , ** kwargs : P . kwargs ) -> R :
4853 task_lock = set_task_lock (task_lock_params = task_lock_params )
4954 scheduler = set_lock_scheduler (task_lock = task_lock , task_lock_params = task_lock_params )
5055
@@ -58,15 +63,15 @@ def wrapper(*args, **kwargs):
5863 return wrapper
5964
6065
61- def wrap_remove_with_lock (func : Callable , task_lock_params : TaskLockParams ) -> Callable :
66+ def wrap_remove_with_lock (func : Callable [ P , R ], task_lock_params : TaskLockParams ) -> Callable [ P , R ] :
6267 """Redis lock wrapper function for TargetOnKart.remove().
6368 When TargetOnKart.remove() is called, remove() will be simply wrapped with redis lock.
6469 https://github.com/m3dev/gokart/issues/265
6570 """
6671 if not task_lock_params .should_task_lock :
6772 return func
6873
69- def wrapper (* args , ** kwargs ) :
74+ def wrapper (* args : P . args , ** kwargs : P . kwargs ) -> R :
7075 task_lock = set_task_lock (task_lock_params = task_lock_params )
7176 scheduler = set_lock_scheduler (task_lock = task_lock , task_lock_params = task_lock_params )
7277
@@ -86,7 +91,7 @@ def wrapper(*args, **kwargs):
8691 return wrapper
8792
8893
89- def wrap_run_with_lock (run_func : Callable [[], Any ], task_lock_params : TaskLockParams ) -> Callable [[], Any ]:
94+ def wrap_run_with_lock (run_func : Callable [[], R ], task_lock_params : TaskLockParams ) -> Callable [[], R ]:
9095 @functools .wraps (run_func )
9196 def wrapped ():
9297 task_lock = set_task_lock (task_lock_params = task_lock_params )
0 commit comments