使用装饰器进行 Python 日志记录

2024-02-23

这是我们面对装饰器时遇到的第一个例子。但我无法意识到我到底想要什么。

一个名为 LOG 的简单装饰器。它应该像这样工作:

@LOG
def f(a, b=2, *c, **d):
    pass

结果应该是这样的:

f(1, pippo=4, paperino='luca')
===== Enter f =====
a = 1
b = 2
pippo = 4
paperino = luca
===== Exit f =====

作为参数传递给函数的每个参数都显示其值。

我发现这个问题比我想象的要难,主要是因为可以通过多种不同的方式将参数传递给函数(想想带有 *c 的元组或带有 **d 的字典)。

我尝试了一个解决方案,但我不确定它是否正确。有点像这样:

def LOG(fn):
    import inspect
    varList, _, _, default = inspect.getargspec(fn)
    d = {}
    if default is not None:
        d = dict((varList[-len(default):][i], v) for i, v in enumerate(default))
    def f(*argt, **argd):
        print ('Enter %s' % fn).center(100, '=')
        d.update(dict((varList[i], v) for i, v in enumerate(argt)))
        d.update(argd)
        for c in d.iteritems():
            print '%s = %s' % c
        ret = fn(*argt, **argd)
        print 'return: %s' % ret
        print ('Exit %s' % fn).center(100, '=')
        return ret
    return f

我觉得这并不像我想象的那么容易,但奇怪的是我在谷歌上没有找到我想要的东西。

你能告诉我我的解决方案是否可以吗?或者你能为我提出的问题提出更好的解决方案吗?

谢谢大家。


我唯一注意到的是dict((varList[i], v) for i, v in enumerate(argt))您使用两次的构造实际上是dict(zip(varList,argt)).

除此之外,我只有元批评:以上内容都不属于日志文件。

而不是通过日志来

  • 使用断言和调试器查看是否使用正确的参数调用函数。
  • 查看函数是否返回您编写的单元测试的正确结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用装饰器进行 Python 日志记录 的相关文章

随机推荐

  • 扭曲的Python getPage

    我试图获得这方面的支持 但我完全感到困惑 这是我的代码 from twisted internet import reactor from twisted web client import getPage from twisted web
  • 编辑控件未使用所选画笔完全重新绘制

    我有一个编辑控件 其背景颜色取决于用户输入的有效性 如果输入有效 编辑控件应保持默认外观 否则背景颜色应更改为浅灰色 我正在检查有效性EN UPDATE处理程序 如果它无效 我存储HWND的编辑控件到vector 视觉样式已启用 当我改变鼠
  • 如何修复错误代码 C4146“一元减运算符应用于无符号类型。结果仍然无符号”?

    数据类型int的最小值为 2 147 483 648 所以 我输入了 int val 2147483648 但是 它有一个错误 unary minus operator applied to unsigned type result sti
  • 如何将 ArrayUtils 用于对象数组,它不会删除数组的内容

    如何删除对象数组的内容 如果还有其他方法可以删除对象数组的内容 请分享 import java util Arrays import java util Scanner import org apache commons lang3 Arr
  • IE中Jquery多级列表问题

    首先对我的英语感到抱歉 好吧 我尝试创建一个可排序的问题 答案列表 它在 FF 中完美运行 但在 IE 中不起作用 在 IE 中 当我尝试对答案 第二级 li 进行排序时 其问题和同一组答案以一种奇怪的方式与所选问题一起移动 Example
  • 基于多列值的 Python pandas groupby 值

    我在 Pandas 数据集中有一个连续的活动数据 sample data code user id 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 4705 4705 4705 4705 4705 223 223
  • 具有 DynamoDB 和 MySQL 双数据源的 Spring Data/JPA 存储库

    我熟悉如何让 Spring 通过多个持久单元和多个entityManagerFactoryBean 实现动态处理多个数据源 但我正在努力解决的是如何拥有 MySQL 方言and通过 spring config xml 文件在同一 sprin
  • 来自调试器的 Ios Xcode 消息:由于内存问题而终止

    我有一个带有集合视图的应用程序 以及此集合视图中的一个单元格 该单元格重定向到外部链接 每当该链接打开时 应用程序就会在后台崩溃并在调试器上显示 由于内存问题而终止 如果我只按主页按钮 应用程序就会继续正常工作 if UIDeviceOri
  • 单例类可以是静态的吗?

    单例类可以是静态的吗 不 单例类应该被实例化 因为该术语本身指的是一个实例 如果将其设为静态类 则无法从中创建单例对象
  • 如何使用Python查找文本文件中的所有isbn?

    我有一个文本文件text isbn里面有大量的 ISBN 我想编写一个脚本来解析它并将其写入一个新的文本文件 每个 ISBN 编号都在新行中 到目前为止 我可以编写用于查找 ISBN 的正则表达式 但无法进一步处理 import re li
  • AngularJS mailto 不发送电子邮件

    我使用以下代码允许我的 AngularJS 应用程序用户使用他们最喜欢的邮件客户端发送电子邮件 但是当我单击 发送 按钮时没有任何反应 有人可以检查我的代码并告诉我我在这里到底缺少什么吗 谢谢
  • 如何在不构建“音频可视化工具”的情况下将 JavaScript 动画与歌曲的节奏同步?

    从我的基本理解来看 JavaScript 音频可视化器是根据实际声波反映音乐的 我想构建像节拍器 http bl ocks org 1399233 这样的东西 我每隔一段时间就为一些 DOM 元素设置动画x beats 我现在这样做的方式是
  • Jasmine 对象“没有方法 'andReturn'”

    茉莉花初学者 茉莉花间谍的第一次尝试 我以为我在模仿格式显示在这里 http pivotal github io jasmine 搜索 andReturn 但我收到一个无法解决的错误 TypeError Object function ca
  • Visual Studio 构建事件立即返回

    我有一个运行时间较长的构建后事件 长到足以令人厌烦地等待 但又短到足以在每次发布编译后完成 我想立即返回到 VS 我尝试过运行批处理文件start但视觉工作室仍在等待cmd返回成功之前关闭窗口 有没有办法在生成此构建后事件时立即返回成功 T
  • 我可以使用 JavaScript 停止元刷新吗?

    以下代码允许用户停止元刷新的发生 并且它成功删除了meta refresh从页面 但浏览器仍然刷新页面 知道如何让它发挥作用吗
  • 无法在 python 3.7 中安装 Matplotlib

    在 Windows 10 64 位机器中安装 matplotlib 时出现错误显示 python setup py egg info failed with error code 1 in C Users Animus AppData Lo
  • Systemd 启用的服务不再在启动时启动

    我很久以前制作了一些自定义的 systemd 服务 它们都具有相同的配置 当然 ExecStart 除外 这个配置工作了很多年 我从 18 04 LTS 版本开始就已经启动并运行了 ubuntu 但现在看起来其中一些 systemd 服务根
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 重绘canvas html5而不闪烁

    我的屏幕每 25 毫秒重绘一次 并且图像闪烁 这是我的代码 var FRAME RATE 40 var intervalTime 1000 FRAME RATE gameLoop function gameLoop context clea
  • 使用装饰器进行 Python 日志记录

    这是我们面对装饰器时遇到的第一个例子 但我无法意识到我到底想要什么 一个名为 LOG 的简单装饰器 它应该像这样工作 LOG def f a b 2 c d pass 结果应该是这样的 f 1 pippo 4 paperino luca E