Эффективно обновляйте FullArgSpec при частичном применении функции - PullRequest
0 голосов
/ 20 октября 2019

Если у меня есть 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(...)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...