Почему в этих декорированных методах есть предупреждения? - PullRequest
1 голос
/ 10 июля 2020

У меня есть строка с декораторами, и первое, что у меня есть, - это обернуть HTTP-вызов для учета неудачных соединений. Рабочий код выглядит следующим образом:

import requests

class Gotify:
    def __init__(self):
        self.url = "https://postman-echo.com/status/200"

    def ensure_safe_call(caller):
        def wrapper(*args, **kwargs):
            try:
                r = caller(*args, **kwargs)
                r.raise_for_status()
            except Exception as e:
                try:
                    print(f"cannot reach gotify: {e}: {r.text}")
                except NameError:
                    print(f"cannot reach gotify: {e} (the response r does not exist)")
            else:
                print("OK notified gotify of result change")

        return wrapper

    @ensure_safe_call
    def send(self, title, message):
        return requests.get(self.url)

Gotify().send("hello", "world")

Это правильный отображает OK notified gotify of result change.

При редактировании этого в PyCharm я получаю два предупреждения, которые я не понимаю:

enter image description here

and

введите описание изображения здесь

Что они означают в контексте моих декораторов (их нет, когда я не использую декораторы)

1 Ответ

0 голосов
/ 10 июля 2020
class Gotify:
    def __init__(self):
        self.url = "https://postman-echo.com/status/200"

    def ensure_safe_call(caller):

Поскольку ensure_safe_call является методом класса, первый аргумент (в вашем случае caller) на самом деле является аргументом self, экземпляром объекта clas - Gotify.

Следовательно, предупреждающее сообщение о том, что объект Gotify не вызывается (он не вызывается, потому что вы не переопределили метод класса __call__ в своем Gotify классе)

Function ensure_safe_call lacks a positional argument - это потому что ensure_safe_call принимает только аргумент self и не определяет никаких фактических входных аргументов (напомним, что caller == self, учитывая то, как вы его определили). Таким образом, ваш декоратор ensure_safe_call не может ничего обернуть, потому что он не принимает аргументы позиции.

Вам необходимо определить позиционный аргумент

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