Skip to content

Commit ecd570c

Browse files
committed
fixes #767
1 parent 1289d0c commit ecd570c

3 files changed

Lines changed: 361 additions & 9 deletions

File tree

fastcore/_modidx.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,7 @@
465465
'fastcore.meta.empty2none': ('meta.html#empty2none', 'fastcore/meta.py'),
466466
'fastcore.meta.funcs_kwargs': ('meta.html#funcs_kwargs', 'fastcore/meta.py'),
467467
'fastcore.meta.method': ('meta.html#method', 'fastcore/meta.py'),
468+
'fastcore.meta.splice_sig': ('meta.html#splice_sig', 'fastcore/meta.py'),
468469
'fastcore.meta.test_sig': ('meta.html#test_sig', 'fastcore/meta.py'),
469470
'fastcore.meta.use_kwargs': ('meta.html#use_kwargs', 'fastcore/meta.py'),
470471
'fastcore.meta.use_kwargs_dict': ('meta.html#use_kwargs_dict', 'fastcore/meta.py')},

fastcore/meta.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44

55
# %% auto #0
66
__all__ = ['test_sig', 'FixSigMeta', 'PrePostInitMeta', 'AutoInit', 'NewChkMeta', 'BypassNewMeta', 'empty2none', 'anno_dict',
7-
'use_kwargs_dict', 'use_kwargs', 'delegates', 'method', 'funcs_kwargs']
7+
'use_kwargs_dict', 'use_kwargs', 'delegates', 'method', 'funcs_kwargs', 'splice_sig']
88

99
# %% ../nbs/05_meta.ipynb #d26e95dd
1010
from .imports import *
1111
from .basics import *
1212
from contextlib import contextmanager
13+
from functools import wraps
14+
from inspect import signature, Parameter
1315
from copy import copy
16+
1417
import inspect
1518

1619
# %% ../nbs/05_meta.ipynb #8f330096
@@ -159,3 +162,14 @@ def funcs_kwargs(as_method=False):
159162
"Replace methods in `cls._methods` with those from `kwargs`"
160163
if callable(as_method): return _funcs_kwargs(as_method, False)
161164
return partial(_funcs_kwargs, as_method=as_method)
165+
166+
# %% ../nbs/05_meta.ipynb #b69b0276
167+
def splice_sig(wrapper, fn, *skips):
168+
"Replace *args/**kwargs in wrapper's sig with fn's params (minus skips)"
169+
w_ps = list(signature(wrapper).parameters.values())
170+
f_ps = [p for p in signature(fn).parameters.values() if p.name not in skips]
171+
split = next((i for i, p in enumerate(w_ps) if p.kind==Parameter.VAR_POSITIONAL), len(w_ps))
172+
pre = w_ps[:split]
173+
post = [p for p in w_ps[split+1:] if p.kind != Parameter.VAR_KEYWORD]
174+
wrapper.__signature__ = signature(wrapper).replace(parameters=[*pre, *f_ps, *post])
175+
return wraps(fn)(wrapper)

0 commit comments

Comments
 (0)