我是靠谱客的博主 活力汽车,最近开发中收集的这篇文章主要介绍python 语法糖太多_带有语法糖的Python,with,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Python 内置了 sqlite3 模块,可以方便地调用 SQLite 数据库。

import sqlite3

conn = sqlite3.connect('test.db')

cur = conn.cursor()

cur.execute('CREATE TABLE students (id BIGINT PRIMARY KEY NOT NULL, name VARCHAR(10) NOT NULL)')

conn.commit()

cur.close()

conn.close()

以上代码有一个问题,就是如果出现异常,那么,数据库不会关闭,所以,更完善的写法如下:

import sqlite3

conn = sqlite3.connect('test.db')

try:

cur = conn.cursor()

cur.execute('CREATE TABLE students (id BIGINT PRIMARY KEY NOT NULL, name VARCHAR(10) NOT NULL)')

conn.commit()

except (sqlite3.Warning, sqlite3.Error) as e:

print(e)

exit(1)

finally:

cur.close()

conn.close()

但是,这么写不免有些繁琐,我们知道, Python 里面有个with ... as ... 语句可以简化代码:

with open('example.txt') as f:

pass

我们也可以自己实现一个支持 with 语句的类!首先,我们来了解一下 with 语句的原理。只要是实现了 __enter__ 和 __exit__ 方法的对象,都可以使用 with 语句,请看下面的例子:

class Example(object):

def __init__(self):

print('__init__被调用')

self.label = '这是一个示例对象'

def __enter__(self):

print('__enter__被调用')

return self.label

def __exit__(self, type_, value, traceback):

print('__exit__被调用')

print(type_, value, traceback)

return True

with Example() as obj:

print(obj)

with Example() as obj:

raise RuntimeError('引发异常')

print('程序正常结束')

输出结果如下:

__init__被调用

__enter__被调用

这是一个示例对象

__exit__被调用

None None None

__init__被调用

__enter__被调用

__exit__被调用

引发异常

程序正常结束

我们来把逻辑捋顺:首先,with 语句执行 Example(),这个过程调用的是 __init__,接着执行的是 __enter__,Python 会把这个方法的返回值赋值给 obj,当程序离开 with 代码块,或者中途有异常抛出,就会执行 __exit__ 方法,如果该方法返回 True,异常将会被抑制。__exit__ 方法有三个参数,分别对应异常类型,异常描述和异常栈。如果没有异常,这三个参数都将是 None。

明白了这些,我们就可以封装一个属于我们自己的数据库操作类了。

import sqlite3

class Sqlite(object):

def __init__(self, filename):

self.conn = sqlite3.connect(filename)

self.cur = self.conn.cursor()

def __enter__(self):

return self

def __exit__(self, exectype, value, traceback):

self.cur.close()

self.conn.close()

def execute(self, command):

self.cur.execute(command)

self.conn.commit()

with Sqlite('test.db') as db:

db.execute('CREATE TABLE students (id BIGINT PRIMARY KEY NOT NULL, name VARCHAR(10) NOT NULL)')

最后

以上就是活力汽车为你收集整理的python 语法糖太多_带有语法糖的Python,with的全部内容,希望文章能够帮你解决python 语法糖太多_带有语法糖的Python,with所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部