gpt4 book ai didi

Python:装饰器:以下代码如何工作?

转载 作者:行者123 更新时间:2023-12-01 06:18:18 25 4
gpt4 key购买 nike

下面代码中的注释正确吗?特别是“instance =...”那个?

# This does nothing.

class donothing(object):
def __init__(self, func):
"""
The 'func' argument is the function being decorated because in this
case, we're not instantiating the decorator class. Instead we are just
using the class object as a callable (a class is always callable as this
is how an instance is returned) to use as a decorator, which means that
it is being instantiated upon definition of the decorated function and
the decorated function is being passed in as an argument to the class's
__init__ method.
"""
self.func = func

def __call__(self, *args, **kwargs):
"""
The __call__ function is called when the decorated function is called
because the function has be eaten by the decorator class. Now it's up to
the this method to return a call to the original function. The arguments
are passed in as args, kwargs to be manipulated.
"""
# Returns original function call with original arguments.
return self.func(*args, **kwargs)

@donothing
def printer(text):
print(text)

printer('hello world')

# The printer function is now an alias for the donothing instance created, so
# the preceding was the same as:
#
# instance = donothing(printer)
# instance('hello world')
#


# Next example:

class checkforkeysinparams(object):
def __init__(self, required):
self.required = set(required)

def __call__(self, params):
def wrapper(params):
missing = self.required.difference(params)
if missing:
raise TypeError('Missing from "params" argument: %s' % ', '.join(sorted(missing)))
return wrapper


# Apply decorator class, passing in the __init__'s 'required' argument.

@checkforkeysinparams(['name', 'pass', 'code'])
def complex_function(params):
# Obviously these three are needed or a KeyError will be raised.
print(params['name'])
print(params['pass'])
print(params['code'])


# Create params to pass in. Note, I've commented out one of the required params.

params = {
'name': 'John Doe',
'pass': 'OpenSesame',
#'code': '1134',
}

# This call will output: TypeError: Missing from "params" argument: code

complex_function(params=params)

最佳答案

是的,完美的描述,装饰器donothing装饰函数printer并返回类 donothing 的对象,所以装饰器简单地归结为这个

x = donothing(func) # donothing is a class not function

如果你想避免 @deco 语法,你可以这样使用它。

所以现在 x 是一个对象,当你执行 x() 时,__call__该对象的 被调用,并在那里调用传入 __init__ 的函数

编辑:第二个装饰器是错误的,因为它只检查参数,但从不调用传递的函数传递给装饰器的函数是名称 params但应该命名为 func 或更好的名称

您可以通过传递正确的参数来测试它是否不执行任何操作

params = {
'name': 'John Doe',
'pass': 'OpenSesame',
'code': '1134',
}
complex_function(params=params)

它不会像复杂函数那样打印参数。

所以正确的装饰器是

class checkforkeysinparams(object):
def __init__(self, required):
self.required = set(required)

def __call__(self, func):
def wrapper(params):
missing = self.required.difference(params)
if missing:
raise TypeError('Missing from "params" argument: %s' % ', '.join(sorted(missing)))

func(params)

return wrapper

在第一个示例中,类本身被用作装饰器,这里是类 checkforkeysinparams 的对象用作装饰器因此函数被传递到 __call__该对象的

关于Python:装饰器:以下代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036288/

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