gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:16 25 4
gpt4 key购买 nike

考虑这个模块:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com