python中的装饰器 - 需要解释

时间:2014-06-21 01:48:28

标签: python decorator

我是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)

如果有人能解释装饰器的概念,我将不胜感激。我试图理解它,但不能。

2 个答案:

答案 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作为装饰者实现了什么,所以我离开了这个因为你没有真正使用它