python中的Decorator-需要解释

python中的Decorator-需要解释,python,decorator,Python,Decorator,我是python新手,无法理解decorators的概念。我试图实现两个修饰符,一个是非负修饰符,它假设一个任意长的整型参数列表,如果其中任何一个小于0,就会抛出异常;另一个是allCaps修饰符,它假设一个任意长的字符串参数列表,并将其大写。然后,编写一个简单的函数来测试每个装饰器,包装它,并演示每个装饰器的工作原理 我已经开始,并且已经到了这一点 #!/usr/local/bin/python2.7 def NonNegative(inputs): for i in inputs:

我是python新手,无法理解decorators的概念。我试图实现两个修饰符,一个是非负修饰符,它假设一个任意长的整型参数列表,如果其中任何一个小于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)
#/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)
。如果你用decorator
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\u f

通过使用修饰符包装函数,
func1

def func1():
    print "inside func1()"

您也可以编写一个类来定义decorator,但在我看来,函数decorator没有那么冗长


您可以通过

了解更多关于装饰者的信息,这些不是装饰者。装饰器包装一个函数,可能返回一个新函数。函数也用
@foo
Mmm.修饰。。你能添加一个带有函数的装饰器示例吗?你在这里真正想做什么,为什么你认为装饰器是实现这一点的方法?我只是想了解一下装饰器我找到了装饰器的最佳描述,对于那些不熟悉它们的人来说,就是这一个-它在各个阶段的概念中构建你。这行做什么-从未来的导入打印功能?习惯。我通常使用Python2.x
from\uuuuu future\uuuuuu导入print\u函数
引入了新的Python 3
print()
函数。在Python2.x中,它是一个语句/keyword.Ok。我只想对一组输入做一个大写。我用与上面相同的方法尝试了它,但抛出了一个错误-TypeError:“NoneType”对象不可调用。无法对此进行调试。请记住,修饰符只是包装其他函数的函数,可能会返回新函数。它们将函数作为输入。
def func1(f):
    print "Entering", f.__name__
    print "inside func1()"
    print "Exited", f.__name__