如果想自定义一个类或者函数使用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
最后
以上就是烂漫斑马最近收集整理的关于python contextmananger装饰器与with的全部内容,更多相关python内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复