此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...
生活随笔
收集整理的這篇文章主要介紹了
此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 上下文管理器
一個類只要實現(xiàn)了 __enter__() 和 __exit__() 這個兩個方法,通過該類創(chuàng)建的對象我們就稱之為上下文管理器。
上下文管理器可以使用 with 語句,with語句之所以這么強大,背后是由上下文管理器做支撐的,也就是說剛才使用 open 函數(shù)創(chuàng)建的文件對象就是就是一個上下文管理器對象。
自定義上下文管理器類,模擬文件操作:
定義一個File類,實現(xiàn) __enter__() 和 __exit__() 方法,然后使用 with 語句來完成操作文件, 示例代碼:
# 自定義上下文管理器類 class File(object):def __init__(self, file_name, file_mode):self.file_name = file_nameself.file_mode = file_modedef __enter__(self):# 上文方法,負責返回操作對象資源,比如:文件對象,數(shù)據(jù)庫連接對象self.file = open(self.file_name, self.file_mode)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):# 下文方法,負責釋放對象資源,比如:關閉文件,關閉數(shù)據(jù)庫連接對象self.file.close()print('over')# with語句 結合上下文管理器對象使用 with File('1.txt', 'r') as f:# content = f.read()# print(content)f.write('qqq') # 報錯,但是仍然執(zhí)行了關閉連接操作代碼說明:
- __enter__ 表示上文方法,需要返回一個操作文件對象
- __exit__ 表示下文方法,with語句執(zhí)行完成會自動執(zhí)行,即使出現(xiàn)異常也會執(zhí)行該方法
2. 上下文管理器裝飾器方式實現(xiàn)
假如想要讓一個函數(shù)成為上下文管理器,Python 還提供了一個 @contextmanager 的裝飾器,更進一步簡化了上下文管理器的實現(xiàn)方式。通過 yield 將函數(shù)分割成兩部分,yield 上面的語句在 __enter__ 方法中執(zhí)行,yield 下面的語句在 __exit__ 方法中執(zhí)行,緊跟在 yield 后面的參數(shù)是函數(shù)的返回值。
from contextlib import contextmanager# 加上裝飾器,那么下面函數(shù)創(chuàng)建的對象就是一個上下文管理器 @contextmanager def my_open(file_name, file_mode):global filetry:file = open(file_name, file_mode)# yield關鍵字之前的代碼可以認為是上文方法,負責返回操作對象資源yield fileexcept Exception as e:print(e)finally:# yield關鍵字后面的代碼可以認為是下文方法,負責釋放操作對象的資源file.close()print('over')# 普通函數(shù)不能結合with語句使用 with my_open('1.txt', 'r') as file:# content = file.read()# print(content)file.write('1')轉載于CSDN
Python上下文管理器_南枝向暖北枝寒-CSDN博客?blog.csdn.net如有侵權請聯(lián)系刪除。
感謝關注和點贊
總結
以上是生活随笔為你收集整理的此上下文中不支持函数定义。请在代码文件中创建函数。_深入解析Python上下文管理器,让你不再迷茫!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wav文件头修复_标记管理音频文件工具:
- 下一篇: vim循环下表复制_Vim求生手册,让你