2014-01-25 5 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) 함수 안에 데코레이터를 사용할 수 있습니까? 사전에 키가 있는지 없는지를 확인해야하는 경우, 함수의 깊이가 내려간 것처럼?

편집

나는 첫 번째 질문에 대한 답을 얻었다.

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

왜 내부 함수에 사전을 정의합니까? 'dictionary.has_key'가 항상 true가 아닐까요? 그리고 어쨌든 데코레이터 기능을 만드는 데 대한 목표는 무엇입니까? 그런데 함수를 정의 할 때마다 데코레이터를 사용할 수 있습니다. – aIKid

+0

(1) 데코레이터는 기능을 정의 할 때만 사용되며, 그와 마찬가지로 사용할 수 있습니까? 라인 또는 코드 사이의 의미입니까? (2) 하나의 함수에 여러 데코레이터가있는 경우 데코레이터가 실행되는 순서는 무엇입니까? –

+0

아마도이 [답변] (http://stackoverflow.com/a/1594484/1672128) 데코레이터 도움이 될 수 있습니다. 읽기, 그것은 당신이 데코레이터에 대해 알아야 할 모든 것입니다. –

답변

0

데코레이터를 매개 변수화해야하는 경우 클래스를 정의하고 __init__을 통해 데코레이터에 대한 인수를 전달하고 __call__ 함수를 재정의 할 수 있습니다. 예 :

(2)의 경우, 함수 내에서 장식 할 다른 함수가 있으면 예. 그런 일을 할 필요가 있다면, 아마도 장식 자 대신에 함수가 필요할 것이다.

+0

데코레이터를 사용할 수있는 중첩 된 함수가 있는지는 알지만, 내 경우에는 중첩 된 함수가 없습니다. 그것은 단순한 코드 줄 집합입니다. 또한 편집 한 질문을보고 내 방식대로 (1) 완료했는지 확인하십시오. 그것을하는 올바른 방법입니까 ?? –

+0

예, (1)에 대한 귀하의 방법도 완벽하게 좋습니다. 데코레이터는 function_을 (를) 데코 레이팅하는 데 사용됩니다. 다른 기능이 없으면 단순히 데코레이터가 필요하지 않습니다. 여러 위치에서 재사용 할 수있는 또 다른 기능 만 있으면됩니다. 장식 된 함수가 _it_가 장식되어 있거나 심지어 그 내부의 장식을 만질 필요가 있다는 것을 알아야만하는 경우, 데코레이터를 잘못된 방법으로 사용하고있는 것입니다. –

+0

내가 하나의 함수에 여러 데코레이터가있는 경우 어떤 순서로 데코레이터가 실행됩니까? –

관련 문제