概述
如果想自定义一个类或者函数使用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 contextmananger装饰器与with所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复