如何将函数作为参数传递给另一个函数并使用python中该函数返回的值?

时间:2014-01-14 17:27:43

标签: python

我试图否定一个函数返回的值。

考虑代码

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

check = negate(greater)

assert check(8,9)

OR

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

check = negate(equal)

assert check("python","java")

我应该如何定义 NEGATE 功能?

3 个答案:

答案 0 :(得分: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 :(得分:2)

像这样:

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

这是一个函数,它创建一个函数,它返回调用原始函数的结果并not它的返回值,然后返回该函数。

答案 2 :(得分: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是可选的,但确保包装器从原始函数中获取docstring和其他可内省属性,使其行为更像是包装函数。

演示:

>>> 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