2014-10-30 1 views
1

나는 정의, 간단한 기능을 가지고있다. simple_function(x)가 LOWER_BOUND에 대한 마찬가지로 upper_bound(x)의 값을 초과하거나, 내가 값 upper_bound(x)을 반환 simple_function(x)의 장식 된 버전을 원 lower_bound(x) 아래로 떨어지면하고있는 경우, 특히파이썬 장식은

def upper_bound(x): 
    return x**2 

def lower_bound(x): 
    return np.zeros(len(x)) 

이러한 경계 조건은 X의 자체 기능입니다 . 파이썬에서 @decorator 구문을 사용하여이 동작을 어떻게 수행 할 수 있습니까? __doc__ 등의 특히를 수정하는 것보다 다른

답변

0

, 여기 당신은 다음과 같습니다 처리되지 않는 상한보다 높은 것으로

def constrain(lower, upper): 
    def outer(f): 
    def inner(x): 
     r = f(x) 
     u = upper(x) 
     if r > u: 
     return u 
     l = lower(x) 
     if r < l: 
     return l 
     return r 
    return inner 
    return outer 

...

@constrain(lower_bound, upper_bound) 
def simple_function(x): 
    ... 

는 다르게 유형과 하한.

+0

멋진 대답을! 이것은 훌륭하게 작동하며 단일 변수 인수에 대한 훌륭한 구문 템플릿이지만 numpy 배열에서는 작동하지 않습니다. 그 목적을 위해 구문을 흔들리는 방법을 알고 있습니까? – aph

+0

NumPy 배열은 단일 인수입니다. * 특정 * 문제가 있습니까? –

+0

문제가 인수가 아니라 반환 값으로 의심됩니다. 스칼라를 비교하는 것과 같은 방식으로 numpy 배열을 비교할 수 없다 ('all'을 사용해야하거나'l' 또는'u '를 반환하는 대신 범위를 벗어나는 값을 원소 단위로 바꾸기 위해) '). – Blckknght

2

인수, 범위 및 결과가 모두 numpy 배열 인 경우 upper_boundlower_bound 함수가 반환하는 해당 값 사이에서 각 요소를 고정 할 수 있도록 몇 가지 배열 할당을 수행 할 수 있습니다. 핵심 부분은 다음과 같습니다

r = f(x) 
l = lower_bound(x) 
u = upper_bound(x) 

i = r < l 
j = r > u 

r[i] = l 
r[j] = u 

ij 인덱스는 각각 하부 및 상부 경계에 고정 될 필요가있는 말 부울 배열 될 것입니다. 데코레이터로이 코드가 작동하려면, 당신은과 같이 중첩 된 기능의 한 쌍의 내부에 넣어해야합니다

def clamp(f): 
    @functools.wraps(f) 
    def wrapper(x): 
     r = f(x) 
     l = lower_bound(x) 
     u = upper_bound(x) 

     i = r < l 
     j = r > u 

     r[i] = l 
     r[j] = u 

     return r 

    return wrapper 

functools.wraps가 장식 기능의 그것 때문에 래퍼 함수를 ​​복사 이름, 주석 및 문서화 문자열을 만든다 .

위의 코드는 항상 동일한 upper_boundlower_bound 기능을 사용한다고 가정합니다. 당신이 장식하고 다른 기능에 대한 사용자 정의 할 것과해야 할 경우, 중첩의 추가 레이어를 추가하고 이그나시오 바스케스 - 에이 브람스의 대답처럼 "장식 공장"을 정의 할 수 있습니다

def clamp(lower_bound, upper_bound): # this is the decorator factory function 
    def decotator(f):     # this is the decorator function 
     @functools.wraps(f) 
     def wrapper(x):    # this is the wrapper function 
      ... # same code here as above 
      return r 

     return wrapper 

    return decorator 
+0

Bickknght, 멋진 코드입니다. 이 구현은 놀라운 일입니다. 감사합니다! – aph

+0

내 유일한 슈퍼 마이너 조정은 numpy 배열 (r = np.where (r aph