2014-01-14 2 views
1

Я пытаюсь отрицать значение, возвращаемое одной функцией.Как передать функцию как аргумент другой функции и использовать значение, возвращаемое этой функцией в python?

Рассмотрим код, чтобы быть

def greater(a,b): 
    return a>b 

check = negate(greater) 

assert check(8,9) 

ИЛИ

def equal(a,b): 
    return a==b 

check = negate(equal) 

assert check("python","java") 

Как я должен определить нивелируют функции ???

ответ

2

Как это:

def negate(func): 
    def result(*args): 
    return not func(*args) 
    return result 

Это функция, которая создает функцию, которая возвращает результат вызова исходной функции и not ИНГ это возвращаемое значение, а затем возвращаются эта функция.

+0

Это было идеально. Спасибо :) – codefreak

+0

@RiteshBhat: Конечно. Рад помочь. – Linuxios

1

Используйте оператор not в декораторе:

from functools import wraps 

def negate(func): 
    @wraps(func) 
    def wrapper(*args, **kw): 
     return not func(*args, **kw) 
    return wrapper 

выше декоратор возвращает функцию-оболочку, которая применяется к not возвращаемому значению обернутой функции. @functools.wraps() decorator в приведенном выше примере является необязательным, но гарантирует, что оболочка получает исходную функцию и другие интроспективные атрибуты от исходной функции, что делает ее более близкой к завершенной функции.

Демо:

>>> from functools import wraps 
>>> def negate(func): 
...  @wraps(func) 
...  def wrapper(*args, **kw): 
...   return not func(*args, **kw) 
...  return wrapper 
... 
>>> def greater(a,b): 
...  return a>b 
... 
>>> check = negate(greater) 
>>> check(8, 9) 
True 
+0

Я попробовать это, но это показывает TypeError: «BOOL» объект не вызываемая – codefreak

+0

Попробуйте еще раз, я пропустил нюанс вашего вопроса. –

+0

yep я получил его :) – codefreak

3

Используйте функцию стиль decorator:

def negate(func): 
    def inner(*args, **kwargs): 
     val = func(*args, **kwargs) 
     return not val 
    return inner 

Демо:

>>> greater(10, 20) 
False 
>>> negate(greater)(10, 20) 
True 

Чтобы сохранить вещи, как docstring и другие атрибуты функции передается в negate вы можете использовать functools.wraps.

from functools import wraps 

def negate(func): 
    @wraps(func) 
    def inner(*args, **kwargs): 
     val = func(*args, **kwargs) 
     return not val 
    return inner 
+1

Вы копируете редактирование Martijns? Один из вас, ребята, должен просто удалить ваш ответ. – wim

+0

@wim Его оригинальный ответ был неправильным, я никого не копирую. –

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