Python функция перегрузки с декоратором - PullRequest
0 голосов
/ 22 февраля 2020

Вот мой код, который я попробовал:

class Request(object):
    def __init__(self, method, path):
        self.method = method.upper()
        self.path = path
        self.h = {
            "Content-Type": "application/json;charset=UTF-8",
            "Accept-Language": "en-US"
        }

    def __call__(self, f):
        def wrapper(obj, *args, **kwargs):
            payload = f(obj, *args, **kwargs)
            URL = "{}{}".format(obj.host, self.path)

            if payload is not None:
                try:
                    res = requests.request(self.method,
                                           url=URL,
                                           headers=self.h,
                                           data=json.dumps(payload),
                                           timeout=3)
                except requests.RequestException as e:
                    print(e)
                    return
            else:
                try:
                    res = requests.request(self.method,
                                           url=URL,
                                           headers=self.h,
                                           timeout=3)
                except requests.RequestException as e:
                    print(e)
                    return
            return res
        return wrapper

class MyClass(object):
    def __init__(self, host):
        self.host = host

    @Request(method="get", path="/status")
    def status(self):
        pass

    @Request(method="put", path="/status")
    def status(self, set_state):
        body = {
            "state_id": set_state
        }
        return body

Есть некоторые вопросы, которые я не знаю:

В MyClass, есть две функции, которые я хочу перегрузка с тем же именем и с разными аргументами.

И я хочу использовать разные аргументы для декоратора с этими функциями (@Request (method = " put или post ", путь = "/ status"))

Я знаю, что моя перегрузка функции неправильная, если я попробую так:

    @Request(method="<how can i change this with different args>", path="/status")
    def status(self, set_state=None):
        if set_state is not None
            body = {
                "state_id": set_state
            }
            return body

Как я могу установить различные аргументы для декоратора по значению аргументы из функции?

...