Python中函数的条件修饰

2024-04-25 12:28:14 发布

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

出于调试目的,我想编写一个函数来执行以下操作:

  1. 如果调试模式==0,则不回显任何消息。你知道吗
  2. 如果debug\u mode==1,则用print()将消息回显到标准输出
  3. 如果debug\u mode==2,则将消息回显到日志文件

我曾想过用函数装饰器(我以前从未使用过)来实现这一点。你知道吗

实际上,我想替换一些print(),我在一些点中放了这些print()来显示中间值,同时学习函数装饰器。你知道吗

我不想创建一个类来实现这一点。这是我的方法,但行不通:

import logging

FORMAT = '%(asctime)s %(levelname)s %(message)s %(funcName)s'
logging.basicConfig(filename='example.log', level=logging.DEBUG, format=FORMAT, datefmt='%m/%d/%Y %I:%M:%S %p')

def debug(func):
    def _debug(deb=0, *args, **kwargs):
        if deb == 1:
            print(msg)
            func(*args, **kwargs)
        if deb == 2:
            logging.debug(msg)
    return _debug

@debug
def echo(msg, deb=0):
    pass

if __name__ == "__main__":
    debug_mode = 1
    echo("This is a debugging message!", debug_mode)

如果我不需要传递param debug_模式,并且在decorator函数中,我可以直接从__main__使用debug状态,那就更好了。你知道吗


Tags: 函数debugformat消息messageifmodelogging
1条回答
网友
1楼 · 发布于 2024-04-25 12:28:14

代码的问题在于传递参数的方式。当你做echo("This is a debugging message!", debug_mode)的时候,你实际上是在调用def _debug(deb=0, *args, **kwargs),所有的参数都是乱七八糟的(deb变成了"This is a debugging message!"等等)。关于StackOverflow,有一个关于如何使用decorator的惊人的tutorial。你知道吗

我不知道为什么在代码中需要*args, **kwargs。我个人认为在你的特殊情况下没有必要做任何装饰。不管怎样,出于教育目的,与装饰师一起工作的代码可能如下所示:

import logging

FORMAT = '%(asctime)s %(levelname)s %(message)s %(funcName)s'
logging.basicConfig(filename='example.log', level=logging.DEBUG, format=FORMAT, datefmt='%m/%d/%Y %I:%M:%S %p')

def debug(func):
    def _debug(msg, deb=0):
        if deb == 1:
            func(msg, deb)
        if deb == 2:
            print 'Log: ' + msg + ' Level: ' + str(deb)
            logging.debug(msg)
    return _debug

@debug
def echo(msg, deb):
    print 'Echo: ' + msg + ' Level: ' + str(deb) 

if __name__ == "__main__":
    echo("This is a debugging message!")
    echo("This is a debugging message!", 0)
    echo("This is a debugging message!", 1)
    echo("This is a debugging message!", 2)

以及输出:

Echo: This is a debugging message! Level: 1
Log: This is a debugging message! Level: 2

相关问题 更多 >