LUO DJ 2019-12-29 23:01 采纳率: 0%
浏览 140

关于python装饰器多层闭包的提问

  • ** 背景**:在学习装饰器中遇到问题

  • ** 环境**:以下代码均为windows版anaconda3中执行的代码

  • 问题:尽管已经实践过并且没有找到可行的方法,但是我仍然想问,为什么不将logit和logging_decorator这两个函数合一,变成类似第二段代码的样式?我目前理解装饰器的核心是闭包,但是为什么不尽量减少闭包的数量,将功能尽并到一起?是因为无法实现吗?

  • 标准代码

from functools import wraps

def logit(logfile='out.log'):
    def logging_decorator(func):
        @wraps(func)
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + " was called"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                # 现在将日志打到指定的logfile
                opened_file.write(log_string + '\n')
            return func(*args, **kwargs)
        return wrapped_function
    return logging_decorator

@logit()
def myfunc1():
    pass

myfunc1()
# Output: myfunc1 was called
# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串
  • 我的设想(该代码会报错,仅用于注解猜想)
from functools import wraps

def logging_decorator(func,logfile=''out.log):
    @wraps(func)
    def wrapped_function(*args, **kwargs):
        log_string = func.__name__ + " was called"
        print(log_string)
        # 打开logfile,并写入内容
        with open(logfile, 'a') as opened_file:
            # 现在将日志打到指定的logfile
            opened_file.write(log_string + '\n')
        return func(*args, **kwargs)
    return wrapped_function

@logging_decorator(logfile='out.log')
def myfunc1():
    pass

myfunc1()
# Output: myfunc1 was called
# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串
  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 孟德尔随机化结果不一致
    • ¥20 求用stm32f103c6t6在lcd1206上显示Door is open和password:
    • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
    • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
    • ¥15 谁有desed数据集呀
    • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
    • ¥15 关于#hadoop#的问题
    • ¥15 (标签-Python|关键词-socket)
    • ¥15 keil里为什么main.c定义的函数在it.c调用不了
    • ¥50 切换TabTip键盘的输入法