@ code构造在python中意味着什么?

时间:2013-07-25 22:41:31

标签: python-2.7 urwid

我正在查看urwid提供的wicd应用程序中的文件wicd-curses.py。有一个名为wrap_exceptions的函数,然后在文件的其他几个地方我找到了一些像 @wrap_exceptions 这样的代码,它发生在其他几个函数之前。这是什么意思?

1 个答案:

答案 0 :(得分:5)

这些被称为decorators

装饰器是接受另一个方法作为输入的方法。然后,装饰器将对给定的函数执行某些操作以更改输出。

在数学术语中,装饰器可以看起来有点像g(f(x)),其中g是装饰器,f是要装饰的原始函数。装饰器可以对给定的函数执行任何操作,但通常它们将它们包装在某种验证或错误管理中。

This blog对装饰者有很好的解释;一个例子是一个包装方法,它检查简单坐标系中的参数:

class Coordinate(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return "Coord: " + str(self.__dict__)

def inputChecker(func):
    def checker(a, b): # 1
        if a.x < 0 or a.y < 0:
            a = Coordinate(a.x if a.x > 0 else 0, a.y if a.y > 0 else 0)
        if b.x < 0 or b.y < 0:
            b = Coordinate(b.x if b.x > 0 else 0, b.y if b.y > 0 else 0)
        ret = func(a, b)
        if ret.x < 0 or ret.y < 0:
            ret = Coordinate(ret.x if ret.x > 0 else 0, ret.y if ret.y > 0 else 0)
        return ret
    return checker

# This will create a method that has automatic input checking.
@inputChecker
def addChecked(a, b):
    return Coordinate(a.x + b.x, a.y + b.y)

# This will create a method that has no input checking
def addUnchecked(a, b):
    return Coordinate(a.x + b.x, a.y + b.y)

one = Coordinate(-100, 200) # Notice, negative number
two = Coordinate(300, 200)

addChecked(one, two)
addUnchecked(one, two)

当坐标与addChecked一起添加时,它会忽略负数并假设它为零;结果是:Coord: {'y': 400, 'x': 300}。但是,如果我们执行addUnchecked,则会获得Coord: {'y': 400, 'x': 200}。这意味着在addChecked中,装饰器的输入检查忽略了负值。传入的变量不会更改 - 只会暂时更正a内的bchecker(a, b)

修改:我添加了一个小解释,并针对dkar扩展了博客中的一个示例。