我试图否定一个函数返回的值。
考虑代码
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 功能?
答案 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