gpt4 book ai didi

python - 理解装饰器函数中的作用域和 *args 和 **kwargs

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

为什么在下面的装饰器示例中,wrapper() 函数需要 *args**kwargs

def currency(f):
def wrapper(*args, **kwargs):
return '$' + str(f(*args, **kwargs))

return wrapper

class Product(db.Model):

name = db.StringColumn
price = db.FloatColumn

@currency
def price_with_tax(self, tax_rate_percentage):
"""Return the price with *tax_rate_percentage* applied.
*tax_rate_percentage* is the tax rate expressed as a float, like "7.0"
for a 7% tax rate."""
return price * (1 + (tax_rate_percentage * .01))

传递给 price_with_tax(self, tax_rate_percentage) 的参数是否已经在 def currency(f) 函数的范围内可用,因此可用于 wrapper() 函数?

为什么我们不能直接将 f() 传递给 wrapper()

我只是想了解为什么 wrapper()*args**kwargs 以及两者如何获得参数传递给 price_with_tax(self, tax_rate_percentage)

最佳答案

包装器将一个函数作为参数并返回另一个函数。为了使返回的函数尽可能有用(即应用于任何函数或方法),它必须接受任意数量的参数。

考虑一下装饰器的作用。这:

@currency
def price_with_tax(self, tax_rate_percentage):
return price * (1 + (tax_rate_percentage * .01))

本质上只是这个的简写:

def price_with_tax(self, tax_rate_percentage):
return price * (1 + (tax_rate_percentage * .01))
price_with_tax = currency(price_with_tax)

price_with_tax 最终是 currency 的返回值,因此它也应该是一个至少接受两个参数的函数 (selftax_rate_percentage)。

但是,@currency 可用于装饰许多其他函数,这些函数可能采用不同数量的 args 和不同的关键字参数,因此像 currency 这样的装饰器通常采用变量处理所有情况的参数。

关于python - 理解装饰器函数中的作用域和 *args 和 **kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803020/

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