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 如何在scanpy上做差异基因和通路富集?
    • ¥20 关于#硬件工程#的问题,请各位专家解答!
    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?
    • ¥15 c++头文件不能识别CDialog