gpt4 book ai didi

python - 为什么每次调用装饰函数时不执行装饰器?

转载 作者:行者123 更新时间:2023-12-04 02:38:48 25 4
gpt4 key购买 nike

我写了下面的代码来学习python中的闭包和装饰器。

代码在 iPad 上的 Pythonista 中执行良好。

但是装饰器并没有像我想象的那样工作。装饰器旨在使函数在每次调用时以独特的随机颜色打印出来。但看起来装饰器只在所有函数调用中被调用一次。有人可以解释为什么吗?

import random
import console

def random_color(func):
r = random.random()
g = random.random()
b = random.random()
print(f'console.set_color({r},{g},{b})')
console.set_color(r,g,b)
return func

@random_color # run set_tag function through decorator function.
def set_tag(tag):
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text

# save enclose_text function with a remembered tag
h1 = set_tag('h1')
p = set_tag('p')
br = set_tag('br')

# execute enclose_text with different text strings
h1('Chapter One')
p('It was a dreary day. The rain had begun to set in ...')
br('')
h1('Chapter Two')
p('By the second day, the sun had returned to full strength.')

所有行的输出都是相同的颜色。下次我运行它时,所有线条都具有相同的颜色 - 但与第一次执行时颜色不同。我希望装饰器使每个标签具有随机颜色。

有人能解释一下这不是什么情况吗?

下面是输出:

<h1>Chapter One</h1>
<p>It was a dreary day. The rain had begun to set in ...</p>
<br></br>
<h1>Chapter Two</h1>
<p>By the second day, the sun had returned to full strength.</p>

最佳答案

装饰器在函数定义时执行;装饰器语法只是函数应用的语法糖。

@random_color  # run set_tag function through decorator function. 
def set_tag(tag):
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text

相当于

def set_tag(tag):  
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text

set_tag = random_color(set_tag)

你应该这样定义你的装饰器:

def random_color(func): 
def wrapper(*args, **kwargs):
r = random.random()
g = random.random()
b = random.random()
print(f'console.set_color({r},{g},{b})')
console.set_color(r,g,b)
return func(*args, **kwargs)
return wrapper

也就是说,random_color 应该返回一个设置控制台颜色的函数,然后调用原始函数。

此外,set_tag 不是您要修饰的函数:它是 set_tag 创建的函数:

def set_tag(tag):
@random_color
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text

以前,set_tag 是一个函数,它会选择一种随机颜色,将控制台设置为使用该颜色,然后返回一个会生成标签的函数。我假设此时对 set_color 的调用会影响终端,而不是当 print 最终被调用时。现在,它是一个返回函数的函数,该函数既选择随机颜色使用该颜色生成标签。

关于python - 为什么每次调用装饰函数时不执行装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60368608/

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