Python - 装饰器

pyt*_*der 16 python python-decorators

我正在努力学习装饰器.我理解它的概念,现在试图实现它.

这是我写 的代码代码是不言自明的.它只是检查参数是否传入int.

def wrapper(func):
    def inner():
        if issubclass(x,int): pass
        else: return 'invalid values'

    return inner()

@wrapper
def add(x,y):
    return x+y

print add('a',2)
Run Code Online (Sandbox Code Playgroud)

这是错误的说法global name 'x' is not defined.我明白它没有定义inner,但不知道如何纠正这个代码?我哪里错了?

slo*_*oth 23

你的装饰者应该是这样的:

def wrapper(func):
    def inner(x, y): # inner function needs parameters
        if issubclass(type(x), int): # maybe you looked for isinstance?
            return func(x, y) # call the wrapped function
        else: 
            return 'invalid values'
    return inner # return the inner function (don't call it)
Run Code Online (Sandbox Code Playgroud)

一些要点:

  • issubclass 期望一个类作为第一个参数(你可以用一个简单的try/except TypeError替换它).
  • 包装器应返回一个函数,而不是被调用函数的结果
  • 你应该在内部函数中实际调用包装函数
  • 你的内在功能没有参数

你可以在这里找到装饰器的好解释.

  • 为了更加向上兼容,你可以使用一个灵活的参数列表:`def inner(x,*args,**kwargs):`和`return func(x,*args,**kwargs)`. (2认同)