美文网首页
contextlib-@contextmanager与closi

contextlib-@contextmanager与closi

作者: huashen_9126 | 来源:发表于2020-04-07 22:53 被阅读0次

ftp操作完成后自动关闭连接:

import ftplib
from contextlib import contextmanager

class FTP(object):
    def __init__(self, host, port, user, passwd):
        self.ftp = ftplib.FTP()
        self.ftp.connect(host, port)
        self.ftp.login(user, passwd)
        print(self.ftp.welcome)

    def download_file(self, local_file, remote_file):
        file_handler = open(local_file, 'wb')
        self.ftp.retrbinary("RETR %s" % remote_file, file_handler.write)
        file_handler.close()
        return True

    def close(self):
        self.ftp.close()

@contextmanager
def ftp_download(host, port, user, passwd):
    print('Begin')
    f = FTP(host, port, user, passwd)
    yield f
    f.close()
    print('End')

#使用
with ftp_download('172.16.19.70', 21, 'ftpuser', '1qaz@WSX') as f:
    f.download_file('xxxxx', 'yyyyy')

简单应用场景:在某段代码执行前后自动执行特定代码

from contextlib import contextmanager

@contextmanager
def tag(name):
    print(f"<{name}>")
    yield
    print(f"</{name}>")

with tag("h1"):
    print("hello")
    print("world")

#结果:
<h1>
hello
world
</h1>

ftp自动关闭连接的closing实现:

import ftplib
from contextlib import closing

class FTP(object):
    def __init__(self, host, port, user, passwd):
        self.ftp = ftplib.FTP()
        self.ftp.connect(host, port)
        self.ftp.login(user, passwd)
        print(self.ftp.welcome)

    def download_file(self, local_file, remote_file):
        file_handler = open(local_file, 'wb')
        self.ftp.retrbinary("RETR %s" % remote_file, file_handler.write)
        file_handler.close()
        return True

    def close(self):
        self.ftp.close()
        print('End')

with closing(FTP('172.16.19.70', 21, 'ftpuser', '1qaz@WSX')) as f:
    f.download_file(r'C:\Users\geek\Desktop\xx', '/xx.PH')

closing也是一个经过@contextmanager装饰的generator,相当于:

@contextmanager
def closing(thing):
    try:
        yield thing
    finally:
        thing.close()

相关文章

  • contextlib-@contextmanager与closi

    ftp操作完成后自动关闭连接: 简单应用场景:在某段代码执行前后自动执行特定代码 ftp自动关闭连接的closin...

  • && 与& ,||与|

    回忆知识点i++,,++i变量在前 先用变量符号(☞++/--)在前 先计算

  • 认真与身板

    认真与身板 认真与态度 认真与自信 认真与信心 认真与诚心 认真与正心 认真与正念 认真与正面 认真与精诚 认真与...

  • 与荒野,与你,与自己

    周末了,想跟大家分享一首诗 《阿莱夫》 诗作者:赖尔逊 阿莱夫在草原上盖了一栋房子, 犹如大海上的灯塔。 但你无法...

  • 与雪与丘与故土

  • 与海与浪与念

    木君 下午,在一段段风雨的催促下来到了绥中。天是被蒙起来的,太阳早已不知躲到哪里去了。微弱的日光和着轻柔的海风洒在...

  • 晚风与柳 孤独与狗 桥与落叶 马与白隙 云与苍天 梭与星月 天与地 生与死 树与来路 花与过往 我与你 爱与恨 夜色与酒

  • 海街日记

    和解。与他人和解、与家人和解、与自己和解;与得到和解、与失去和解;与过去和解、与现在、未来和解;与现实和解、与虚幻...

  • 生怕忘了的题目

    少与不少 多与不多 苦与不苦 乐与不乐 对与不对 错与不错 离与不离 合与不合 唱与不唱 说与不说

  • 2017-04-11

    体验入:真诚.与专业。幽默与风趣。赞美与了解。认可与相信。沟通与关注。关心与引领。快乐与持续。简单与重复。 ...

网友评论

      本文标题:contextlib-@contextmanager与closi

      本文链接:https://www.haomeiwen.com/subject/rsekphtx.html