iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python with魔法语句
  • 112
分享到

python with魔法语句

语句魔法python 2023-01-31 04:01:44 112人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

通常之前我们在打开文件的时候都是:file = open("a.txt") try:     data = file.read() finally:        file.close()*每一个打开文件之后要关闭文件描述符,但是使用wit

通常之前我们在打开文件的时候都是:

file = open("a.txt")
try:  
  data = file.read()
finally:    
   file.close()

*每一个打开文件之后要关闭文件描述符,但是使用with语句则不用:

whih open("a.txt") as f:
   print f.readline()

这个是with默认封装的好的一个魔法盒子,封装了__enter__和__exit__两个函数:

为了我们自己的类也可以使用with, 只要给这个类增加两个函数__enter__, __exit__即可:

>>> class A:
...      def __enter__(self):
...         print "in enter"
...      def __exit__(self, a, b, c):
...         print "in exit"

>>> with A() as a:          
...     print "in with"

...
in enter
in with
in exit


*可以看到当我们使用with的适合最先调用的是__enter__函数,然后进行下面的操作,结束之后才到__exit__函数:


写一个类似打开文件的操作:

#!/usr/bin/env python
class demo:
    def __init__(self, path, mode):
        self.path = path
        self.mode = mode
    def __enter__(self):
        return self
    def write(self, text):
        print self.path,self.mode
        print(text)
    def __exit__(self, a, b ,c):
        return True
with demo("attr.py","w") as f:
    f.write("hello world")

执行效果:
[root@monitor Python]# python test_with.py 
attr.py w
hello world

*这里把打开文件读取,转换成打印传入的参数和执行with里面write函数的操作。

__exit__方法里面的,a,b,c分别表示:异常类型如value.Error、异常描述、Traceback;当使用return True 时候表示会捕获异常,return False时候表示会抛出异常。


提示异常操作:

#!/usr/bin/env python
class demo:
    def __init__(self, path, mode):
        self.path = path
        self.mode = mode
    def __enter__(self):
        return self
    def write(self, text):
        print self.path,self.mode
        print(text)
    def __exit__(self, a, b ,c):
        print a
        print b
        print c
        return True
with demo("a.py","w") as f:
    f.write("hello world")
    int("error")

执行效果:

[root@monitor python]# python test_with.py 
a.py w
hello world
<type 'exceptions.ValueError'>
invalid literal for int() with base 10: 'error'
<traceback object at 0xb3e3f8>


这样with可以帮助我们完成很多重复操作,比如初始化,连接数据库,关闭数据库Socket等多个重复操作。

举例用with语法往graphite的socker监听端口打数据。

#!/usr/bin/python
# coding:utf-8
import errno
import time
import socket
class CarbonClient(object):
    def __init__(self, host, port):
        self._host = host
        self._port = port
        self._carbon = None
        self._connected = None
    def connect(self):
        """
            建立socket连接
        """
        if not self._connected:
            self._connect()
    def connected(self):
        return self._connected
    def _connect(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        while 1:
            try:
                sock.connect((self._host, self._port))
            except socket.error as e:
                if e.errno == errno.EINTR:
                    continue
                else:
                    raise e
            break
        self._carbon = sock
        self._connected = True
    def close(self):
        if self._connected:
            self._carbon.close()
            self._connected = False
    def send(self, metrics):
        chunk_start, chunk_end = 0,20
        while 1:
            payload = []
            metrics_chunk = metrics[chunk_start: chunk_end]
            if not metrics_chunk:
                break
            for metric in metrics_chunk:
                if len(metric) == 2:
                    payload.append("{} {} {}\n".fORMat(metric[0], metric[1], int(time.time())))
                elif len(metric) == 3:
                    payload.append("{} {} {}\n".format(*metric))
                else:
                    raise ValueError("Error format data")
            self._carbon.sendall("".join(payload))
            chunk_start, chunk_end = chunk_end, chunk_end + 20
    def __enter__(self):
        self.connect()
        return self
    def __exit__(self, exec_type, exec_value, exc_tb):
        self.close()
        return exec_value is None
class RebootCarbonClient(CarbonClient):
    REBOOT_CARBON_ADDR = ("192.168.1.54", 2003)
    def __init__(self):
        super(RebootCarbonClient, self).__init__(*self.REBOOT_CARBON_ADDR)
"""
    1条:
        (key, value, time)
        (key, value)
    多条
        [(key, value), (key, value)]
graphite api
"""
if __name__ == "__main__":
    with RebootCarbonClient() as client:
        client.send([("hostname.sys.mem.usage", '1096'), ("hostname.sys.mem.usage", '2048')])



--结束END--

本文标题: python with魔法语句

本文链接: https://www.lsjlt.com/news/187966.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python with魔法语句
    通常之前我们在打开文件的时候都是:file = open("a.txt") try:     data = file.read() finally:        file.close()*每一个打开文件之后要关闭文件描述符,但是使用wit...
    99+
    2023-01-31
    语句 魔法 python
  • VBS中With语句的用法
    本篇内容介绍了“VBS中With语句的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!With 语句对一个对象执行一系列的语句。With ...
    99+
    2023-06-08
  • python中的With语句怎么用
    这篇文章主要为大家展示了“python中的With语句怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中的With语句怎么用”这篇文章吧。With语句如果我们想打开某个文件,我们...
    99+
    2023-06-27
  • WITH语句怎么用
    这篇文章主要为大家展示了“WITH语句怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WITH语句怎么用”这篇文章吧。在 12c 中,你可以用 SQL 更快...
    99+
    2024-04-02
  • MySQL with语句讲解
    目录一.提升代码的可读性和可维护性二.with递归备注:测试数据库版本为MySQL 8.0 今天我们来聊聊MySQL的with语句对于逻辑复杂的sql,with可以大大减少临时表的数...
    99+
    2022-11-16
    mysql with语句 mysql with
  • sql语句with as的用法详解
    这篇文章主要介绍“sql语句with as的用法详解”,在日常操作中,相信很多人在sql语句with as的用法详解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sql语句w...
    99+
    2024-04-02
  • MySQL with语句讲解
    目录一.提升代码的可读性和可维护性二.with递归备注:测试数据库版本为mysql 8.0 今天我们来聊聊MySQL的with语句对于逻辑复杂的sql,with可以大大减少临时表的数量,提升代码的可读性、可维护性 MyS...
    99+
    2024-04-02
  • Python中的with语句解析和实践
    with语句在我们的日常Python代码编写中时常会用到,我们通常知道可以用with语句来代替try…except…finally这样的写法,但是为什么它能够替代,如果在with中发生了异常怎么处理,这背后的原理却是并不是很明了...
    99+
    2023-01-31
    语句 Python
  • sql语句中with as的用法介绍
    本篇内容介绍了“sql语句中with as的用法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • python3,浅谈with的神奇魔法
    在实际的编码过程中,有时有一些任务,需要事先做一些设置,事后做一些清理,这时就需要python with出场了,with能够对这样的需求进行一个比较优雅的处理,最常用的例子就是对访问文件的处理。 一般访问文件资源时我们会这样处理: f ...
    99+
    2023-01-31
    浅谈 神奇 魔法
  • python怎样创建支持with语句的对象
    小编给大家分享一下python怎样创建支持with语句的对象,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!创建支持 with语句...
    99+
    2024-04-02
  • python如何创建支持with语句的对象
    小编给大家分享一下python如何创建支持with语句的对象,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!创建支持「with」语句的对象举例而言,我们都知道如何使用「with」语句打开文件或获取锁,但是我们可以实现自己上下...
    99+
    2023-06-27
  • python中with遇到错误语句如何处理
    本篇文章给大家分享的是有关python中with遇到错误语句如何处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。说明将错误的类型、值和回溯传递给_exit__方法。允许__e...
    99+
    2023-06-20
  • python中with语句的工作原理是什么
    python中with语句的工作原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程...
    99+
    2023-06-14
  • python如何对文件对象使用with语句
    小编给大家分享一下python如何对文件对象使用with语句,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对文件对象使用with...
    99+
    2024-04-02
  • python怎么创建支持with语句的对象
    这篇文章主要为大家展示了“python怎么创建支持with语句的对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python怎么创建支持with语句的对象”这篇文章吧。创建支持「with」语句...
    99+
    2023-06-26
  • mysql中有没有with as语句
    这篇文章主要为大家展示了mysql中有没有with as语句,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“mysql中有没有with as语句”这篇文章吧。 ...
    99+
    2024-04-02
  • MySQL的with语句怎么使用
    本文小编为大家详细介绍“MySQL的with语句怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySQL的with语句怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。备注:测试数据库版本为MySQ...
    99+
    2023-07-04
  • JavaScript 中with 语句如何使用
    本篇文章为大家展示了JavaScript 中with 语句如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JavaScript 有个 with 关键字, wi...
    99+
    2024-04-02
  • python语句--条件语句
    一、print语句、import语句、赋值语句。1.1、print语句:输出>>> print(2,3,4)    //python2.x(2, 3, 4)>>> >>> print(1...
    99+
    2023-01-31
    语句 条件 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作