python - 使用修饰函数作为函数的默认参数

标签 python python-2.7 logging decorator python-decorators

考虑这个模块:

#mymodule.py
import logging

def print_start_end(name):
    """
    Decorator that creates a logger and logs the start 
    and the end of the function call
    """
    def decorator(f):
        logger = logging.getLogger(name)
        def wrapper(*args, **kwargs):
            logger.info("start")
            res = f(*args, **kwargs)
            logger.info("end")
            return res
        return wrapper
    return decorator

@print_start_end(__name__)
def f(x):
    return x

def g(y=f(3)):
    return y

还有一个示例脚本:

import logging
from mymodule import f

logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)

print f(3)

输出:

start
end
3

装饰器正在工作。但现在我编写了一个脚本来使用 g 而不是 f:

import logging
from mymodule import g

logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)

print g()

输出:

3

执行语句print g()时,对f的调用成功,因为它打印了预期的返回值3。但是为什么它不打印“开始”和“结束”?

最佳答案

请注意,def g(y=f(3)): 中的 f(3) 仅执行一次,当函数是定义的,而不是每次调用时都定义的。

因此,问题似乎是在 mymodule 中执行 f(3) 时,记录器尚未初始化。先初始化,再导入,就可以了:

import logging

logger = logging.getLogger("")
logger.setLevel(logging.INFO)
h = logging.StreamHandler()
h.setLevel(logging.INFO)
logger.addHandler(h)

from mymodule import g

print g()

关于python - 使用修饰函数作为函数的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31053128/

相关文章:

python - 有没有一种使用范围创建元组列表的有效方法?

python - 理解 Python 类和对象

python - 需要帮助设计解决方案来计算自动换行函数的 "penalty"

python - 获取两个元组列表之间的差异

python - myhdl中的yield语句

java - spring-boot 记录新线程的运行时异常

python - Cron 作业正在将错误写入错误日志,但无法将输出写入输出日志文件

python 检查 noee 异常

python - 识别 U+10FFFF 以上的代码点

python - flask 日志记录 - 无法将其写入文件