Если у меня есть FullArgSpec
для функции, есть ли эффективный способ получить новый FullArgSpec
для функции, если она была применена частично?
Если у меня еще нет FullArgSpec
доступно, я могу сделать следующее:
In [0]: from inspect import getfullargspec
In [0]: from functools import partial
In [0]: foo = lambda x, y, z, *args, john="doe", **kwargs: None
In [0]: %timeit getfullargspec(partial(foo, 42, y=666, lorem="ipsum"))
67.4 µs ± 773 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Но это getfullargspec
кажется немного медленным, поэтому мне было интересно, можно ли сделать это значительно быстрее, если я уже вычислил FullArgSpec
из foo
.
In [33]: argspec = getfullargspec(foo)
In [34]: new_argspec = somehow_update_fullargspec(argspec, 42, y=666, lorem="ipsum")
Может ли somehow_update_fullargspec
использовать argspec
, чтобы быть значительно более эффективным, чем в первом примере, и существует ли такая функция? В этом нетривиальном примере ответ должен быть следующим:
FullArgSpec(args=[], varargs=None, varkw='kwargs', defaults=None, kwonlyargs=['y', 'z', 'john'], kwonlydefaults={'y': 666, 'john': 'doe'}, annotations={})
Выходные данные (и повышенные исключения) должны быть идентичны getfullargspec(partial(...))
.