将time.sleep()添加到指令而不是新行

时间:2015-04-24 21:39:51

标签: python

我的脚本中有很多必要的time.sleep()。我想清理代码并可能将等待/暂停附加到上一行而不是创建新行。例如:

call(['networksetup', '-setv4off', 'direct IP'])
time.sleep(5)

有没有办法实现这个目标? (Python 3.4)

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果您的意思是将这两行合并为一行,请尝试:




  call(['networksetup',' -  setv4off','direct IP' ]); time.sleep(5)
  



答案 1 :(得分:0)

如果您无条件地希望能够在特定功能(或一组功能)之后睡觉,那么我所知道的最简单的方法是使用装饰器。

from functools import wraps
import time

def sleep_decorator(f, duration = 5.0):
    @wraps(f)
    def wrapper(*args, **kwargs):
        result = f(*args, **kwargs)
        time.sleep( duration )
        return result
    return wrapper

@sleep_decorator
def call(*args, **kwargs):
    return None

call(['networksetup', '-setv4off', 'direct IP'])

该解决方案的问题是睡眠的持续时间不能改变,并且您无法根据具体情况启用和禁用睡眠呼叫。

要增强解决方案,您可以为装饰器添加参数。

from functools import wraps
import time

def sleep_decorator(duration = 5.0, active = True):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            result = f(*args, **kwargs)
            sleep_duration = kwargs.get('duration', duration)
            sleep_active = kwargs.get('active', active)
            if sleep_active:
                time.sleep( sleep_duration )
            return result
        return wrapper
    return decorator

这意味着您现在可以按如下方式编写代码:

@sleep_decorator(active = False, duration = 0.1)
def call(*args, **kwargs):
    return None

call(['networksetup', '-setv4off', 'direct IP'])
call(['networksetup', '-setv4off', 'direct IP'], active = True)
call(['networksetup', '-setv4off', 'direct IP'], active = True, duration = 1.0)

另一个可以让你注入代码的替代方法是在运行时重写代码的Abstract Syntax Tree。这将允许您注入任意函数调用。像numbapony这样的库使用这样的技巧将Python代码转换为特定于域的代码。