我是python的新手,无法理解装饰器的概念。我试图实现两个装饰器,一个,nonNegative,它假定一个任意长的整数参数列表,如果任何小于0则抛出异常,另一个,allCaps,它假设一个任意长的字符串参数列表,并将它们大写。然后,编写一个简单的函数来测试每个函数,包装它,并演示每个装饰器的工作原理。
我已经开始并且已经到了这一步。
#!/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)
如果有人能解释装饰器的概念,我将不胜感激。我试图理解它,但不能。
答案 0 :(得分:3)
将装饰器视为包装函数的函数。
在数学中你可能有一个函数f(x)
。如果你用装饰器g
包装它,你有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_f
。
通过使用装饰器包装函数,func1
从
def func1():
print "inside func1()"
到
def func1(f):
print "Entering", f.__name__
print "inside func1()"
print "Exited", f.__name__
你也可以编写一个类来定义一个装饰器,但在我看来,函数装饰器不那么冗长。
您可以阅读有关this excellent intro here.
的装饰器的更多信息答案 1 :(得分:2)
以下是您尝试执行的操作的示例子集:
#!/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])
<强>输出:强>
$ 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
请参阅:https://wiki.python.org/moin/PythonDecorators
PS:我真的不确定你试图通过allCaps
作为装饰者实现了什么,所以我离开了这个因为你没有真正使用它