我有两个问题。我创建了一个装饰器来检查字典是否有密钥?在这里。
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条件?
答案 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。如果你需要做这样的事情,你可能只需要一个函数而不是装饰器。