Python-我可以在函数内部使用装饰器吗?

时间:2014-01-25 09:18:11

标签: python python-decorators

我有两个问题。我创建了一个装饰器来检查字典是否有密钥?在这里。

def check_has_key(func):
    def inner(x,y): # inner function needs parameters
        dictionary = {"add" : "true", "subtract" : "true"}
        if dictionary.has_key("add") : 
            return func(x,y)
        return "Add not allowed"
    return inner # return the inner function (don't call it)

@check_has_key
def add(x,y):
    return x+y

print add(1,2)

1)我可以将密钥作为参数传递给包装器,然后检查它是否存在?例如: - 就像我只是将密钥作为@check_has_ket("subtact")传递。

2)我可以在函数中使用装饰器吗?如果我需要检查字典是否有密钥,请在内部功能?

修改

我得到了第一个问题的答案。

def abc(a):
    def check_has_key(func):
        def inner(x,y): # inner function needs parameters
            dictionary = {"add" : "true", "subtract" : "true"}
            if dictionary.has_key(a) : 
                return func(x,y)
            return "Add not allowed"
        return inner # return the inner function (don't call it)
    return check_has_key

@abc("subtract")
def add(x,y):
    return x+y

print add(1,2)

但是我的疑问仍然存在,我可以使用装饰深入的功能吗?这意味着如果我需要检查字典中是否存在某个键,或者不是在该函数内部,我是否可以将装饰器用于此目的,或者我是否必须仅使用if条件?

1 个答案:

答案 0 :(得分:0)

如果您需要参数化您的装饰器,您可以定义一个类,通过__init__传递装饰器的参数并覆盖其__call__函数。类似的东西:

class decorate:

    def __init__(self, decorator_arg):
        self.decorator_arg = decorator_arg

    def __call__(self, func):
        def inner(x,y):
            # do something, probably using self.decorator_arg
            return func(x,y)
        return inner

@decorate("subtract")
def add(x,y):
    return x+y

对于(2),如果你在你的函数中有另一个函数来装饰,则为yes。如果你需要做这样的事情,你可能只需要一个函数而不是装饰器。