【问题标题】:Function wrapper for multiple code lines in PythonPython中多行代码的函数包装器
【发布时间】:2020-11-29 18:45:42
【问题描述】:

我想在一个函数周围封装一些代码(例如打印计时信息)并将这个函数用于多个代码块:

start = time.time()
print('Started adding numbers at {}'.format(start))
a = 1
b = 2
c = a + b
end = time.time()
print('Finished adding numbers in {} seconds'.format(end - start)')

是否可以将多行代码包装成一个包装函数,而不为每个代码块定义函数?一种方法是定义一个函数并使用一个装饰器,但我想避免对每个代码块都这样做:

@print_time
def foo():
    a = 1
    b = 2

    return a + b

【问题讨论】:

    标签: python python-decorators


    【解决方案1】:

    您可以创建一个上下文管理器类并在 with 块中执行您的代码。这将实现紧凑且高度可重用的计时器功能。像这样的:

    import time
    
    class TimeClass():
        def __init__(self):
            pass
        def __enter__(self):
            self.start = time.time()
        def __exit__(self, type, value, traceback):
            self.end = time.time()
            print('Finished executing in {} seconds'.format(self.end - self.start))
    

    你可以像这样使用这个类:

    with TimeClass():
        # your code
        pass
    

    查看this link 了解更多详情。

    【讨论】:

      【解决方案2】:

      您对此有何看法:

      您定义了一个计时器类,它按名称保存计时器,例如代码块的描述,并将您喜欢的所有打印和操作作为 optins 放入 stop_timer 函数中。它仍然是两行代码,但我认为你会得到更少的代码

      import time as t
      
      class myTimer:
          def __init__(self):
              self.timers = {}
          def start_timer(self, name):
              print('Started adding numbers at {}'.format(t.time()))
              self.timers[name] = t.time()
          def stop_timer(self,name):
              runtime = t.time() - self.timers[name]
              del(self.timers[name])
              print('Finished adding numbers in {} seconds'.format(runtime))
              return runtime
      
      timer = myTimer()
      
      
      timer.start_timer('First Timer')
      timer.start_timer('Second Timer')
      a = 1
      t.sleep(1)
      b = 2
      timer.stop_timer('First Timer')
      c = 3
      t.sleep(2)
      d = 4
      timer.stop_timer('Second Timer')
      

      返回

      Started adding numbers at 1606676633.8297324
      Started adding numbers at 1606676633.8297324
      Finished adding numbers in 1.0228865146636963 seconds
      Finished adding numbers in 3.0250420570373535 seconds
      

      【讨论】:

        【解决方案3】:

        另一种方法是使用context managers

        例如:

        from contextlib import contextmanager
        
        @contextmanager
        def timer():
            start = time.time()
            print('Started adding numbers at {}'.format(start))
            yield
            end = time.time()
            print('Finished adding numbers in {} seconds'.format(end - start))
        
        
        # Then call it like that
        with timer():
            a = 1
            b = 2
            c = a + b
        

        【讨论】:

          【解决方案4】:

          你可以使用高阶函数来做到这一点,例如:

          def inner():
              pass
          
          def outer(inner):
              inner()
          

          然后调用

          outer(inner)
          

          【讨论】:

          • 我明确指出我不想定义额外的函数来包装代码块
          猜你喜欢
          • 2017-10-17
          • 2018-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多