设为首页 - 加入收藏  
您的当前位置:首页 >数据库 >终于解决了使用Python装饰器中的一个痛点 正文

终于解决了使用Python装饰器中的一个痛点

来源:汇智坊编辑:数据库时间:2025-11-05 14:07:28

 前言

如何给装饰器的终于装饰参数传参,这个问题曾经困扰我好久,解决虽然Python版本的使用更新,现在这个问题终于解决了,器中特此记录。痛点

疑问

首先我有一个这样的终于装饰装饰器文件路径helper/log_helper.py

import traceback from functools import wraps from loguru import logger def my_logger(count):     def step1(foo):         @wraps(foo)         def step2(*args, **kwargs):             try:                 result = foo(*args, **kwargs)                 logger.info(f"{result=},{count=}")             except Exception:                 logger.exception(traceback.format_exc())         return step2     return step1 

然后我有个文件需要引用这个装饰器demo.py

from helper.log_helper import my_logger class Demo:     @my_logger(count=2)     def main(self):         return "in main function" if __name__ == __main__:     d = Demo()     d.main() 

输出结果如下

2020-10-16 11:43:12.001 | INFO     | helper.log_helper:step2:18 - result=in main function,count=2 

这个装饰器的作用很简单,就是解决获取当前函数的返回值,和传入的使用count值。

好,器中现在问题来了?痛点

如果给装饰器的参数传值呢,源码下载也就是终于装饰说我的count=2,是解决通过传值的形式。你想到可能是使用这样

from helper.log_helper import my_logger COUNT=2 class Demo:     @my_logger(count=COUNT)     def main(self):         return "in main function" if __name__ == __main__:     d = Demo()     d.main() 

ok,这样确实可以,器中我们还可以使用再简化一步

from functools import partial from helper.log_helper import my_logger COUNT=2 my_logger = partial(my_logger,痛点count=2) class Demo:     @my_logger()     def main(self):         return "in main function" if __name__ == __main__:     d = Demo()     d.main() 

暂时来看我们搞定了传参数的问题,这时候我们想如果外界调用了Demo类的main方法,并且向指定count的值怎么办呢?

我们知道外界调用Demo类传参的唯一途径就是向__init__里进行传参数,香港云服务器按照这个思路我们只能这么写了,

class Demo:     def __init__(self):         count =2     @my_logger(count=self.count)     def main(self):         return "in main function" 

但是这样并不可以,我们得到错误信息

NameError: name self is not defined 

在装饰器中无法使用self.形式的参数,难道这个问题解决不了么?

问题解决

在Python3.7之前确实没什么可行的方案。

我们知道在Python3.7的时候引入了dataclasses,我们可以通过它来简化__init__。

改下我们的代码

from functools import partial from helper.log_helper import my_logger from dataclasses import dataclass @dataclass() class Demo:     count: int = 2     logger: my_logger = partial(my_logger, count)     @logger()     def main(self):         return "in main function" if __name__ == __main__:     d = Demo()     d.main() 

如果使用Python3.8那么可以直接忽略掉dataclass

class Demo:     count: int = 2     logger: my_logger = partial(my_logger, count)     @logger()     def main(self):         return "in main function" 

这样我们就成功的解决了这个问题,突然想起来之前遇到的这个难题,现在算是解决了,希望对你有帮助。IT技术网

上一篇:小米手机屏幕效果如何?(一探小米手机屏幕的色彩表现和显示质量)
下一篇:ubuntu系统如何切换root用户身份 本文将为大家介绍ubuntu切换root用户帐号方法,希望对大家有所帮助!说明:小编的这个建议只适合于10.10之前版本的ubuntu系统,后面的11.04,11.10。。。14.04系统因为采用的默认桌面不同,所以本经验不适用,若要使用,那么请安装GNOME桌面方法/步骤1、按照下面的方式打开终端工具,或者使用终端工具的快捷键Ctrl + Alt +T 打开终端2、终端工具打开后如下图所示,我们的操作就在这个窗口中进行3、切换root用户的的方式一执行命令 sudo su执行上面点命令后会要求我们输入当前我们的密码4、输入密码后就切换到root用户了,我们可以看到当前的用户已经是root了5、退出root用户的方法在切换成root用户后,我们只要执行exit命令就退出root用户账号了6、切换为root用户账户的第二种方法执行sudo -i命令也可以将当前用户有普通用户切换到root用户模式中7、执行命令后,一般也要求输入我们的密码,小编这里因为是刚切换到root用户不久,所以系统不要求输入密码,一般在10分钟之内我们来回切换root用户时系统不会提示输入密码,之后会要求我们再次输入密码END以上就是ubuntu切换root用户帐号方法介绍,希望对大家有一定的帮助!
最新文章

1.5774s , 11668.2421875 kb

Copyright © 2025 Powered by 终于解决了使用Python装饰器中的一个痛点,汇智坊  滇ICP备2023006006号-2

sitemap

Top