我在努力学习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)
说global name 'x' is not defined
是抛出错误。我知道它不是在inner
下定义的,但不知道如何更正此代码?我哪里做错了?
我发现你当前的代码有三个问题。
首先,调用
inner
函数,而不是返回对它的引用。其次,您的
inner
函数的参数与您要装饰的函数的参数不同。在这种情况下,您至少需要显式地接受x
参数(一些内部函数可以独占地使用*args
和**kwargs
,但不一定是您的函数)。最后,您永远不会调用包装函数。虽然这不是严格要求的(在开发过程中用decorator替换方法可能很有用),但通常您希望在内部函数的代码中的某个时刻调用该函数。
所以,为了把整个事情都总结起来,我想你希望你的代码是这样的:
如果要在类型检查失败时正确终止add方法,也可以引发异常。像这样
结果:
你的装潢师应该看起来像:
一些要点:
issubclass
需要一个类作为第一个参数(您可以用一个简单的try/except TypeError替换它)。你可以找到一个很好的解释。
相关问题 更多 >
编程相关推荐