51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 617|回复: 0
打印 上一主题 下一主题

[python] 奇妙的上下文管理器

[复制链接]
  • TA的每日心情
    慵懒
    2024-9-26 17:55
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2024-9-27 10:52:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
          python中操作文件、会话、网页之类的通常需要一个资源句柄,它通常通过对应的类初始化来申请相应的资源,又在使用完成后通过close或logout之类的操作手动释放资源,对于新手而言经常由于忘记释放这些资源导致系统卡死或故障。为解决这一问题,python引入了with语法,通过该语法可以自动实现资源的管理和自动释放,其背后其实是使用了上下文管理器,除了with我们也可以通过调用contextlib中的contextmanager来实现这一功能,比如下面的代码,通过加入@contextmanager魔术字来实现资源的自动管理与释放。
    1. @contextmanager
    2. def g_login(ip,port=22,user='root',pwd='root'):
    3.     conn = SSHclient() if port==22 else TelnetClient()
    4.     try:
    5.         if conn.login(ip,port,user,pwd):
    6.             print('login %s success'%ip)           
    7.            yield conn
    8.         except Exception as e:
    9.             print('login %s fail:%s'%(ip,e))
    10.         finally:
    11.             conn.logout()
    12.     print('logout %s'%ip)
    复制代码
    那么,即然with是用来管理上下文资源的,是否支持多层㠌套调用呢?当然可以,如下代码
    1. def test_cardop():
    2.     with g_login('10.18.1.1',22,'root','root') as conn:
    3.         with CardOp(conn) as t:
    4.             print(t.card_op('10.26.0.5',9002,['ipconfig']))
    复制代码
    通过双层with调用,不仅如此,我们可以看到在第二层with中调用的函数使用了第一层调用的句柄,这意味着对于复数级的资源调用,也可以通过这种多层嵌套的方式处理,通过对这一语方的封装,比如用eval()函数实现自动编写后执行,可以实现指定的多层登陆跳转、多级设备穿透性维护等功能。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 11:03 , Processed in 0.068591 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表