51Testing软件测试论坛
标题:
奇妙的上下文管理器
[打印本页]
作者:
ufoofuufoofu
时间:
2024-9-27 10:52
标题:
奇妙的上下文管理器
python中操作文件、会话、网页之类的通常需要一个资源句柄,它通常通过对应的类初始化来申请相应的资源,又在使用完成后通过close或logout之类的操作手动释放资源,对于新手而言经常由于忘记释放这些资源导致系统卡死或故障。为解决这一问题,python引入了with语法,通过该语法可以自动实现资源的管理和自动释放,其背后其实是使用了上下文管理器,除了with我们也可以通过调用contextlib中的contextmanager来实现这一功能,比如下面的代码,通过加入@contextmanager魔术字来实现资源的自动管理与释放。
@contextmanager
def g_login(ip,port=22,user='root',pwd='root'):
conn = SSHclient() if port==22 else TelnetClient()
try:
if conn.login(ip,port,user,pwd):
print('login %s success'%ip)
yield conn
except Exception as e:
print('login %s fail:%s'%(ip,e))
finally:
conn.logout()
print('logout %s'%ip)
复制代码
那么,即然with是用来管理上下文资源的,是否支持多层㠌套调用呢?当然可以,如下代码
def test_cardop():
with g_login('10.18.1.1',22,'root','root') as conn:
with CardOp(conn) as t:
print(t.card_op('10.26.0.5',9002,['ipconfig']))
复制代码
通过双层with调用,不仅如此,我们可以看到在第二层with中调用的函数使用了第一层调用的句柄,这意味着对于复数级的资源调用,也可以通过这种多层嵌套的方式处理,通过对这一语方的封装,比如用eval()函数实现自动编写后执行,可以实现指定的多层登陆跳转、多级设备穿透性维护等功能。
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2