2014-01-25 3 views
0

У меня есть 2 вопроса. Я создал декоратор, который проверяет, имеет ли словарь ключ или нет? Вот.Python - могу ли я использовать декоратор внутри функции?

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) Могу ли я использовать декоратор внутри функции? как в случае, если мне нужно проверить, есть ли у словаря ключ или нет, вглубь функции?

EDIT

Я получил ответ на 1-й вопрос.

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

Почему вы определяете словарь _inside_ внутреннюю функцию? Не будет ли тогда «dictionary.has_key» всегда истинным? И какова ваша цель в создании функции декоратора в любом случае? Кстати, вы можете использовать декораторы везде, где вы определяете функцию. – aIKid

+0

(1) Используются ли декораторы только при определении функции или я могу использовать это точно так же, что означает между строками или кодами? (2), в каком порядке выполняются декораторы, если у меня есть несколько декораторов на 1 функции? –

+0

Возможно, этот [ответ] (http://stackoverflow.com/a/1594484/1672128) на декораторах может помочь. Прочтите это, это все, что вам нужно знать о декораторах. –

ответ

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), да, если у вас есть другая функция для украшения внутри вашей функции. Если вам нужно сделать такую ​​вещь, вам, вероятно, просто нужна функция вместо декоратора.

+0

Я знаю, если есть вложенная функция, я могу использовать декоратор, но в моем случае нет вложенной функции. Это простой набор строк кодов. Также, пожалуйста, посмотрите мой отредактированный вопрос и проверьте, что я сделал (1) на моем пути. Правильно ли это? –

+0

Да, ваш способ (1) отлично подходит. Декоратор предназначен для использования функции _декорации функции_, если нет другой функции, вам просто не нужен декоратор. Вам просто нужна другая функция, которую можно повторно использовать в нескольких местах. Если украшенная функция должна знать, что _it_ был украшен или даже нужно коснуться этого декоратора внутри тела, вы используете декоратор неправильно. –

+0

, в каком порядке выполняются декораторы, если у меня есть несколько декораторов на 1 функции? –

Смежные вопросы