python contextmananger装饰器与with

如果想自定义一个类或者函数使用with语句,除了在类中自己定义__enter__()方法和__exit__()方法外,还可以使用contextmananger装饰器。

contextmananger装饰器将yield之前的部分当做__enter__()方法,将yield之后的部分当做__exit__()方法。


import requests
import time
import signal
from contextlib import contextmanagerclass TimeoutException(Exception):
pass


@contextmanager
def time_limit(seconds):
    def signal_handler(signum, frame):
        raise TimeoutException, "Timed out!"
    signal.signal(signal.SIGALRM, signal_handler)
    signal.alarm(seconds)
# yield之前的代码当做__enter__()方法
try: yield

# yield之后的部分当做__exit__()方法
finally: signal.alarm(0) while True: try: # limit the execution time of function with time_limit(1): requests.post(url, data={"a": 1}, timeout=1.1) # requests.post(url, data, verify=False) time.sleep(3) except TimeoutException, msg: print "Timed out!" # print msg raise TimeoutException, "Time out!"

上述代码功能和下面的代码相同

import requests
import time
import signal

url = "http://127.0.0.1:8000/acceptpost/"


# simple one

def signal_handler(signum, frame):
    raise Exception("Timed out!")


signal.signal(signal.SIGALRM, signal_handler)
signal.alarm(1)   # 1 seconds
try:
    req = requests.post(url=url, data={"a": 1})
    time.sleep(10)
except Exception, msg:
    print "Timed out!"
signal.alarm(0)
time.sleep(1)
原文地址:https://www.cnblogs.com/buxizhizhoum/p/8243848.html