Python 的 with 語法糖

2021-10-03 16:22:07 字數 2507 閱讀 6336

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 語法糖

匿名函式 lamda表示式 def add x,y return x y 等價於f lamda x,y x y f 1,2 三元表示式 wefx 1 y 2 c x if x map對映關係 def square x return x x list x 1,3,10 list r map squar...

Python語法糖介紹

作為一門優秀的指令碼語言,python在語法層面提供了很多好玩又實用的語法,俗稱語法糖,正確的使用這些技巧能讓 看起來更優雅,更pythonic,這裡列舉幾個。usr bin env python3 defmain animals cat dog bird pig if dog in animals...

Python中語法糖及帶參語法糖

在python中,符號常被稱作語法糖 裝飾器 在某函式定義時,用以包裝該函式,以達到擷取,控制該函式的目的。def d f print d.k f 此處保留了傳進來的原函式 f def f x return k x 2 return f 此處不能寫成f x f是函式控制代碼,如果帶 則呼叫,這裡只返...