python中的Decorator-需要解释
我是python新手,无法理解decorators的概念。我试图实现两个修饰符,一个是非负修饰符,它假设一个任意长的整型参数列表,如果其中任何一个小于0,就会抛出异常;另一个是allCaps修饰符,它假设一个任意长的字符串参数列表,并将其大写。然后,编写一个简单的函数来测试每个装饰器,包装它,并演示每个装饰器的工作原理 我已经开始,并且已经到了这一点python中的Decorator-需要解释,python,decorator,Python,Decorator,我是python新手,无法理解decorators的概念。我试图实现两个修饰符,一个是非负修饰符,它假设一个任意长的整型参数列表,如果其中任何一个小于0,就会抛出异常;另一个是allCaps修饰符,它假设一个任意长的字符串参数列表,并将其大写。然后,编写一个简单的函数来测试每个装饰器,包装它,并演示每个装饰器的工作原理 我已经开始,并且已经到了这一点 #!/usr/local/bin/python2.7 def NonNegative(inputs): for i in inputs:
#!/usr/local/bin/python2.7
def NonNegative(inputs):
for i in inputs:
if i<0:
raise exception
def allCaps(inputs2):
for i in inputs2:
a = i.upper()
print a
def inputs
def inputs2():
inputfile = open ("input.txt")
sentence = inputfile.readlines()
words = (sentence[0].split())
return words
NonNegative(inputs)
#/usr/local/bin/python2.7
def非负(输入):
对于输入中的i:
如果我这里有一个示例,说明您正在尝试做什么:
#!/usr/bin/env python
from __future__ import print_function
def nonnegative(f):
def wrapper(xs):
for x in xs:
if x < 0:
raise ValueError("{} < 0".format(x))
return f(xs)
return wrapper
@nonnegative
def inputs(xs):
for x in xs:
print(x)
inputs([1, 2, 3, 4])
inputs([-1])
#/usr/bin/env python
来自未来导入打印功能
def非负(f):
def包装(xs):
对于xs中的x:
如果x<0:
raise VALUERROR(“{}<0”。格式(x))
返回f(xs)
返回包装器
@非负
def输入(xs):
对于xs中的x:
打印(x)
输入([1,2,3,4])
输入([-1])
输出:
$ python foo.py
1
2
3
4
Traceback (most recent call last):
File "foo.py", line 23, in <module>
inputs([-1])
File "foo.py", line 11, in wrapper
raise ValueError("{} < 0".format(x))
ValueError: -1 < 0
$python foo.py
1.
2.
3.
4.
回溯(最近一次呼叫最后一次):
文件“foo.py”,第23行,在
输入([-1])
包装器中第11行的文件“foo.py”
raise VALUERROR(“{}<0”。格式(x))
值错误:-1<0
见:
PS:我不太确定你想用allCaps
作为装饰器来实现什么,所以我把它放在一边,因为你没有真正使用它。把装饰器想象成一个包装你函数的函数
在数学中,你可能有一个函数f(x)
。如果你用decoratorg
包装它,你就有了g(f(x))
在python中,表示是
@function_g
def function_f():
pass
下面是一个例子:
def entryExit(f):
def new_f():
print "Entering", f.__name__
f()
print "Exited", f.__name__
return new_f
@entryExit
def func1():
print "inside func1()"
您可以看到,我们定义了一个函数extryExit
,它返回一个包装函数(因此将函数作为其输入)。它将此函数包装在new\u f
中
通过使用修饰符包装函数,func1
从
def func1():
print "inside func1()"
到
您也可以编写一个类来定义decorator,但在我看来,函数decorator没有那么冗长
您可以通过了解更多关于装饰者的信息,这些不是装饰者。装饰器包装一个函数,可能返回一个新函数。函数也用@foo
Mmm.修饰。。你能添加一个带有函数的装饰器示例吗?你在这里真正想做什么,为什么你认为装饰器是实现这一点的方法?我只是想了解一下装饰器我找到了装饰器的最佳描述,对于那些不熟悉它们的人来说,就是这一个-它在各个阶段的概念中构建你。这行做什么-从未来的导入打印功能?习惯。我通常使用Python2.xfrom\uuuuu future\uuuuuu导入print\u函数
引入了新的Python 3print()
函数。在Python2.x中,它是一个语句/keyword.Ok。我只想对一组输入做一个大写。我用与上面相同的方法尝试了它,但抛出了一个错误-TypeError:“NoneType”对象不可调用。无法对此进行调试。请记住,修饰符只是包装其他函数的函数,可能会返回新函数。它们将函数作为输入。
def func1(f):
print "Entering", f.__name__
print "inside func1()"
print "Exited", f.__name__