2014-01-14 17 views

回答

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是可選的,但確保包裝獲得原始函數的docstring和其他introspectable屬性,使其行爲更像包裝函數。

演示:

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

我做了嘗試,但它顯示類型錯誤:「布爾」對象不是可調用 – codefreak

+0

再試一次,我錯過了你的問題的細微差別。 –

+0

是的,我知道了:) – 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他原來的回答是不正確的,我沒有抄襲任何人。 –

相關問題