python - 如何在 Python 中以可重用的方式记录函数参数?

标签 python function logging arguments

我发现自己多次编写这样的代码:

def my_func(a, b, *args, **kwargs):
    saved_args = locals() # Learned about this from http://stackoverflow.com/a/3137022/2829764
    local_var = "This is some other local var that I don't want to log"
    try:
        a/b
    except Exception as e:
        logging.exception("Oh no! My args were: " + str(saved_args))
        raise

运行 my_func(1, 0, "spam", "ham", my_kwarg="eggs") 在 stderr 上给出以下输出:

ERROR:root:Oh no! My args were: {'a': 1, 'args': (u'spam', u'ham'), 'b': 0, 'kwargs': {'my_kwarg': u'eggs'}}
Traceback (most recent call last):
  File "/Users/kuzzooroo/Desktop/question.py", line 17, in my_func
    a/b
ZeroDivisionError: division by zero

我的问题是,我可以写一些可重用的东西,这样我就不必在函数顶部保存 locals() 了吗?它可以用一种很好的 Pythonic 方式完成吗?

编辑:对@mtik00 的另一个请求:理想情况下,我想要某种方式从 my_func 中访问 saved_args 或类似的东西,这样我就可以做一些除了记录未捕获的异常之外的事情(也许我想捕获异常my_func,记录错误,然后继续。

最佳答案

装饰器 正是您要寻找的。这是一个例子:

import logging
from functools import wraps


def arg_logger(func):

    @wraps(func)
    def new_func(*args, **kwargs):
        saved_args = locals()
        try:
            return func(*args, **kwargs)
        except:
            logging.exception("Oh no! My args were: " + str(saved_args))
            raise

    return new_func


@arg_logger
def func(arg1, arg2):
    return 1 / 0

if __name__ == '__main__':
    func(1, 2)

在这里,我使用 arg_logger() 作为装饰器。将装饰器应用于您希望具有此新行为的任何函数。

关于装饰器的讨论很好here .

关于python - 如何在 Python 中以可重用的方式记录函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983150/

相关文章:

python - WIN32 程序可以使用 MYSQL 通过 Django 身份验证系统进行身份验证吗?

python - 如何从分层 csv 生成平面文件 (?)

python - python中的运算符重载

javascript - 为什么 function.toString() 输出 "[native code]",而登录到控制台直接显示函数的源代码?

ruby-on-rails - 禁止在 Ruby on Rails 中记录某些参数

c++ - 如何使用 Pantheios 在日志中包含调用类和行号?

python - 如何检查python中的tableau server中是否存在工作簿

Python:ModuleNotFoundError:没有名为 'xyz' 的模块

jquery - 为一种功能提供更多效果。 jQuery

java - 如何在 Java 动态 Web 项目中创建 Web 服务日志?