一個辦法是裝修要重複的功能:
def repeats_until(num_repeats, interval, condition):
def deco(f):
def func(*args, **kwargs):
for _ in xrange(num_repeats):
result = f(*args, **kwargs)
if condition(result):
return result
time.sleep(interval)
return func
return deco
,然後用它喜歡:(!雖然我不能顯示等待)
@repeats_until(3, 5, lambda s: s == "hello")
def take_input():
return raw_input("Say hello: ")
例
>>> take_input()
Say hello: foo
Say hello: bar
Say hello: baz
>>> take_input()
Say hello: hello
'hello'
或者,爲了保持與被調用函數的條件,如:
def repeats(num_repeats, interval):
def deco(f):
def func(*args, **kwargs):
for _ in xrange(num_repeats):
result = f(*args, **kwargs)
if result is not None: # or e.g. False if None is valid return
return result
time.sleep(interval)
return func
return deco
@repeats(3, 5)
def take_input(condition):
s = raw_input("Say hello: ")
if condition(s):
return s
ui = take_input(lambda s: s == "hello")
這依賴於裝飾函數返回一個值(在這種情況下暗示None
)告訴裝飾它還沒有完成。
這看起來像一個最靈活的方法。額外的+++名稱;) – georg