代码之家  ›  专栏  ›  技术社区  ›  Satoshi

检查函数是否在x时间内未调用

  •  0
  • Satoshi  · 技术社区  · 11 年前

    我在任何地方都找不到这种问题,所以我要在这里问它。

    如何检查我编写的某个特定函数是否在某段时间内未被调用?

    3 回复  |  直到 11 年前
        1
  •  2
  •   kojiro    11 年前

    您可以在函数定义中嵌入上次调用的时间:

    def myfun():
      myfun.last_called = datetime.now()
      # … do things
    

    从这一点来看,应该很容易判断函数是何时调用的。每次调用它时,它都会更新其last_called时间戳。

    更一般的方法是定义一个函数修饰符来附加属性:

    def remembercalltimes(f, *args, **kwargs):
        """A decorator to help a function remember when it was last called."""
        def inner(*args, **kwargs):
            inner.last_called = datetime.now()
            return f(*args, **kwargs)
        return inner
    
    @remembercalltimes
    def myfun():
        # … do things
    
    >>> myfun()
    >>> myfun.last_called
    >>> datetime.datetime(2014, 3, 19, 11, 47, 5, 784833)
    
        2
  •  0
  •   scav    11 年前
    import time
    last_time_f_called = time.time()
    
    def f():
      global last_time_f_called
      now = time.time()
      time_since = now - last_time_f_called
      last_time_f_called = now
      # do whatever you wanted to do about value of time_since
    

    像那样吗?

    如果你想做很多事情的话,你可能可以用一个decorator来包装它,在dict中更新时间,其中key是函数名。。。

        3
  •  0
  •   roippi    11 年前

    这似乎是在函数的 __dict__ 也许和一个装饰师一起。

    def lastcalled(func):
        def inner():
            from datetime import datetime
            then = func.__dict__.get('lastcalled')
            diff = int((datetime.now() - then ).total_seconds()) if then else None
            print('Last called: {}'.format('{} sec ago'.format(diff) if diff else 'Never'))
            func()
            func.lastcalled = datetime.now()
        return inner
    

    演示:

    @lastcalled
    def f():
        print('printing in f()')
    
    f()
    Last called: Never 
    printing in f()
    
    #wait 5 seconds
    
    f()
    Last called: 5 sec ago
    printing in f()
    
    推荐文章