Iain MacCormick
Iain MacCormick

Reputation: 317

Argument names of wrapped function

I have a wrapper defined as follows:

def start_end_date_wrapper_fn(function):
    def start_end_date_wrapper_args(**kwargs):
        kwargs = kwargs.copy() # only update in fn scope
        if kwargs['forecast_or_train'] == 'forecast':
            kwargs['start_date'] = kwargs['start_date'] + dt.timedelta(days=-30)
            kwargs['end_date'] = kwargs['end_date'] + dt.timedelta(days=30)
            del kwargs['train_or_forecast']
        return function(**kwargs)

    return start_end_date_wrapper_args

wrapped function:

@start_end_date_wrapper_fn
def query_data(start_date, end_date):
    # do something

I'm trying to get the names of the arguments of the wrapped function (query_data - start_date, end_date.) Instead the following returns the arguments of the wrapper (kwargs.)

query_data.__code__.co_varnames

Is there a way to get the argument names of the wrapped function?

Upvotes: 0

Views: 67

Answers (1)

quamrana
quamrana

Reputation: 39354

You could get the decorator to make an attribute on the wrapper containing the original function:

def start_end_date_wrapper_fn(function):
    def start_end_date_wrapper_args(**kwargs):
        kwargs = kwargs.copy() # only update in fn scope
        if kwargs['forecast_or_train'] == 'forecast':
            kwargs['start_date'] = kwargs['start_date'] + dt.timedelta(days=-30)
            kwargs['end_date'] = kwargs['end_date'] + dt.timedelta(days=30)
            del kwargs['train_or_forecast']
        return function(**kwargs)

    start_end_date_wrapper_args.original = function
    return start_end_date_wrapper_args

@start_end_date_wrapper_fn
def query_data(start_date, end_date):
    # do something

print(query_data.original.__code__.co_varnames)

Output:

('start_date', 'end_date')

Upvotes: 1

Related Questions