Получить имена параметров функции Python, когда она находится внутри декоратора - PullRequest
0 голосов
/ 29 марта 2020

я хочу получить имена параметров функции, пока она находится в функции декоратора, я продолжаю получать параметры оболочки функции, которые находятся внутри декоратора, а не параметры исходного метода

_component_name_does_not_exist_error это decorator и create_queue_to_component - это метод, я хочу получить хотя бы имена component_name и queue_name

def _component_name_does_not_exist_error(func):
    def function_wrapper(self, component_name):
        if not self._does_component_exist(component_name):
            return self._create_response(
                False,
                f"Component named {component_name} doesn't exist"
            )
        return func

    return function_wrapper

@_component_name_does_not_exist_error
def create_queue_to_component(self, component_name,
                              queue_name, queue_size=1):
    if self.components[component_name].does_queue_exist(queue_name):
        return self._create_response(
            False,
            f"Queue named {queue_name} already exist"
        )

    self.components[component_name].create_queue(queue_name=queue_name,
                                                 queue_size=queue_size)
    return self._create_response(
        True,
        f"The Queue {queue_name} has been created"
    )

Я попытался использовать эти методы без удачи, все возвращают component_name без queue_name (чтобы сделать код ниже более понятным , pipe_manager - это объект класса, содержащий методы)

def get_method_parameters(self):
    print(inspect.signature(self.pipeline_manager.create_queue_to_component))
    print(self.pipeline_manager.create_queue_to_component.__code__.co_varnames)
    print(inspect.getfullargspec(self.pipeline_manager.create_queue_to_component))

Спасибо, что прочитали это и за помощь:)

Ответы [ 2 ]

0 голосов
/ 29 марта 2020
def _component_name_does_not_exist_error(func):
    @functools.wraps(func)
    def function_wrapper(self, *args, **kwargs):
        if not self._does_component_exist(kwargs['component_name']):
            return self._create_response(
                False,
                f"Component named {kwargs['component_name']} doesn't exist"
            )
        return func(self, *args, **kwargs)

    return function_wrapper

Это работает для меня (Спасибо, @wstk, что предложили свой ответ и помогли мне найти ответ)

0 голосов
/ 29 марта 2020

Использование functools.wraps из functools module

import functools

def _component_name_does_not_exist_error(func):
    @functools.wraps(func)
    def function_wrapper(self, component_name):
        if not self._does_component_exist(component_name):
            return self._create_response(
                False,
                f"Component named {component_name} doesn't exist"
            )
        return func

    return function_wrapper

Тогда

print(inspect.signature(self.pipeline_manager.create_queue_to_component))

Дает вам то, что, я думаю, вы хотите, то есть имена аргументов функции create_queue_to_component.

Этот ответ очень хорошо описывает functools.wraps.

...