88import asyncio
99from logging import getLogger
1010from threading import get_ident as get_thread_id
11+ from types import FunctionType
1112from typing import (
1213 Any ,
1314 Awaitable ,
@@ -101,21 +102,23 @@ def dispatch(
101102
102103@overload
103104def use_effect (
104- function : None = None , args : Optional [Sequence [Any ]] = None
105+ function : None = None ,
106+ args : Sequence [Any ] | "ellipsis" | None = ...,
105107) -> Callable [[_EffectApplyFunc ], None ]:
106108 ...
107109
108110
109111@overload
110112def use_effect (
111- function : _EffectApplyFunc , args : Optional [Sequence [Any ]] = None
113+ function : _EffectApplyFunc ,
114+ args : Sequence [Any ] | "ellipsis" | None = ...,
112115) -> None :
113116 ...
114117
115118
116119def use_effect (
117120 function : Optional [_EffectApplyFunc ] = None ,
118- args : Optional [ Sequence [Any ]] = None ,
121+ args : Sequence [Any ] | "ellipsis" | None = ... ,
119122) -> Optional [Callable [[_EffectApplyFunc ], None ]]:
120123 """See the full :ref:`Use Effect` docs for details
121124
@@ -130,6 +133,8 @@ def use_effect(
130133 If not function is provided, a decorator. Otherwise ``None``.
131134 """
132135 hook = current_hook ()
136+
137+ args = _try_to_infer_closure_args (function , args )
133138 memoize = use_memo (args = args )
134139 last_clean_callback : Ref [Optional [_EffectCleanFunc ]] = use_ref (None )
135140
@@ -209,21 +214,23 @@ def dispatch(action: _ActionType) -> None:
209214
210215@overload
211216def use_callback (
212- function : None = None , args : Optional [Sequence [Any ]] = None
217+ function : None = None ,
218+ args : Sequence [Any ] | "ellipsis" | None = ...,
213219) -> Callable [[_CallbackFunc ], _CallbackFunc ]:
214220 ...
215221
216222
217223@overload
218224def use_callback (
219- function : _CallbackFunc , args : Optional [Sequence [Any ]] = None
225+ function : _CallbackFunc ,
226+ args : Sequence [Any ] | "ellipsis" | None = ...,
220227) -> _CallbackFunc :
221228 ...
222229
223230
224231def use_callback (
225232 function : Optional [_CallbackFunc ] = None ,
226- args : Optional [ Sequence [Any ]] = () ,
233+ args : Sequence [Any ] | "ellipsis" | None = ... ,
227234) -> Union [_CallbackFunc , Callable [[_CallbackFunc ], _CallbackFunc ]]:
228235 """See the full :ref:`Use Callback` docs for details
229236
@@ -234,6 +241,7 @@ def use_callback(
234241 Returns:
235242 The current function
236243 """
244+ args = _try_to_infer_closure_args (function , args )
237245 memoize = use_memo (args = args )
238246
239247 def setup (function : _CallbackFunc ) -> _CallbackFunc :
@@ -254,21 +262,23 @@ def __call__(self, func: Callable[[], _StateType]) -> _StateType:
254262
255263@overload
256264def use_memo (
257- function : None = None , args : Optional [Sequence [Any ]] = None
265+ function : None = None ,
266+ args : Sequence [Any ] | "ellipsis" | None = ...,
258267) -> _LambdaCaller :
259268 ...
260269
261270
262271@overload
263272def use_memo (
264- function : Callable [[], _StateType ], args : Optional [Sequence [Any ]] = None
273+ function : Callable [[], _StateType ],
274+ args : Sequence [Any ] | "ellipsis" | None = ...,
265275) -> _StateType :
266276 ...
267277
268278
269279def use_memo (
270280 function : Optional [Callable [[], _StateType ]] = None ,
271- args : Optional [ Sequence [Any ]] = None ,
281+ args : Sequence [Any ] | "ellipsis" | None = ... ,
272282) -> Union [_StateType , Callable [[Callable [[], _StateType ]], _StateType ]]:
273283 """See the full :ref:`Use Memo` docs for details
274284
@@ -279,6 +289,8 @@ def use_memo(
279289 Returns:
280290 The current state
281291 """
292+ args = _try_to_infer_closure_args (function , args )
293+
282294 memo : _Memo [_StateType ] = _use_const (_Memo )
283295
284296 if memo .empty ():
@@ -350,6 +362,23 @@ def _use_const(function: Callable[[], _StateType]) -> _StateType:
350362 return current_hook ().use_state (function )
351363
352364
365+ def _try_to_infer_closure_args (
366+ func : Callable [..., Any ] | None ,
367+ args : Sequence [Any ] | "ellipsis" | None ,
368+ ) -> Sequence [Any ] | None :
369+ if args is ...:
370+ if isinstance (func , FunctionType ):
371+ return (
372+ [cell .cell_contents for cell in func .__closure__ ]
373+ if func .__closure__
374+ else []
375+ )
376+ else :
377+ return None
378+ else :
379+ return cast ("Sequence[Any] | None" , args )
380+
381+
353382_current_life_cycle_hook : Dict [int , "LifeCycleHook" ] = {}
354383
355384
0 commit comments