如何使用Python装饰器来优化编写完成类似工作的不同方法?

2024-04-25 07:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的初学者,我需要一些关于装饰器的帮助。我正在编写一些方法,它们调用使用swagger生成的其他方法。基本上所有这些招摇过市的方法都有GETAPI。我在代码中需要做的就是调用那些招摇过市的方法并返回值。我正在寻找优化方法,而不是为每个API编写相同的方法。我遇到了可以在这种情况下使用的装饰器。但我的实现并没有达到预期的效果

def get_component_info(self, func):
    def inner():
        data = None
        try:
            ret = func()
            if ret.status == 200:
                log.info('ret ' + str(ret))
            else:
                logging.error('Error: ' + str(ret.text))
        except Exception as e:
            logging.error(" failed with error " + str(e.reason) +
                            " and error code " + str(e.status))
        finally:
            return data
    return inner()

def get_firewall_info(self):
    return self._monitor.list_firewall_monitors_with_http_info()     <-- swagger method

def get_firewall_info_caller(self):
    get_firewall_info = self.get_component_info(self.get_firewall_info())

但是上面的实现总是返回None,因为它从不执行self._monitor.list_firewall_monitors_with_http_info(),但是测试没有失败

如果你帮我解决这个问题,那么我可以用它来获取服务器信息、身份验证信息、网络信息等。如果不能使用decorator,我还可以用什么来优化它

谢谢


Tags: 方法selfinfo信息getreturndefswagger
2条回答

修饰符通常是将第二个函数作为参数,然后定义并返回第三个函数的函数,该函数在更改第二个函数的输入和/或输出时调用第二个函数。看起来你在这方面比我初学者做的更好

def decorator(func):
    def inner(*args, **kwargs):
        # Do stuff here...
        value = func(*args, **kwargs)
        # ...or here.
        return value
    return inner

我向您的装饰程序建议的唯一更改不是调用inner并返回结果,而是返回函数本身。进行此更改时,您必须在返回后调用您现在返回的函数

    def get_component_info(self, func):
        def inner():
            # ...
        return inner

    def get_firewall_info_caller(self):
        # You will now want to call the `inner` function after you get
        # it from `get_component_info`.
        get_firewall_info = self.get_component_info(...)()

看起来您的bug的核心是您没有向get_component_info提供函数;您正在提供调用该函数的结果。我认为将代码更改为不调用get_firewall_info应该可以修复代码


    def get_firewall_info_caller(self):
        # You don't want to call the function you're providing to a
        # decorator, since it's expecting the function not the result.
        get_firewall_info = self.get_component_info(self.get_firewall_info)()

我解决了它,如下所示。不确定这是否是正确的方法。请纠正我

def get_component_info(self, func):
    def inner():
        data = None
        try:
            ret = func()
            if ret.status == 200:
                log.info('ret ' + str(ret))
            else:
                logging.error('Error: ' + str(ret.text))
        except Exception as e:
            logging.error(" failed with error " + str(e.reason) +
                            " and error code " + str(e.status))
        finally:
            return data
    return inner

def get_firewall_info(self):
    data = self.get_component_info(self._monitor.list_firewall_monitors_with_http_info)()
    return data

相关问题 更多 >