第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 init 中使用 contextmanager

在 init 中使用 contextmanager

拉風的咖菲貓 2021-09-24 15:21:22
在下面的代碼中,我不明白為什么with super().__init__(*args, **kwargs):MyFileIO2 中的行會拋出一個關(guān)于丟失的錯誤,__exit__而 MyFileIO 類一切正常。我真的不明白在 init 內(nèi)部或外部執(zhí)行 with 之間究竟有什么區(qū)別。有人可以啟發(fā)我這里發(fā)生了什么嗎?import ioclass MyFileIO(io.FileIO):    def __init__(self, *args, **kwargs):        super().__init__(*args, **kwargs)    def __enter__(self, *args, **kwargs):        f = super().__enter__(*args, **kwargs)        print('first byte of file: ', f.read(1))        return fclass MyFileIO2(io.FileIO):    def __enter__(self, *args, **kwargs):        f = super().__enter__(*args, **kwargs)        print('first byte of file: ', f.read(1))        return f    def __init__(self, *args, **kwargs):        with super().__init__(*args, **kwargs): # AttributeError: __exit__            passpath = 'some_file.bin'with MyFileIO(path, 'rb'):    passMyFileIO2(path, 'rb')
查看完整描述

1 回答

?
MMTTMM

TA貢獻1869條經(jīng)驗 獲得超4個贊

您將需要在 上調(diào)用上下文管理器self,因為__init__實際上不會返回任何內(nèi)容。


class MyFileIO2(io.FileIO):

    def __init__(self, *args, **kwargs):

        super().__init__(*args, **kwargs)

        with self:

             pass


    def __enter__(self, *args, **kwargs):

        f = super().__enter__(*args, **kwargs)

        print('First byte of file: ', f.read(1))

        return f

為了測試,我創(chuàng)建了一個內(nèi)容為“hello world”的二進制文件。


_ = MyFileIO2(path, 'rb')    

# First byte of file:  b'h'

發(fā)生的事情是super().__init__通過上下文管理器傳遞的返回值,因此您有效地擁有:


with None:

     pass


AttributeError: __enter__

上下文管理器嘗試調(diào)用對象__enter__上的方法NoneType,但這是一個無效的操作。


查看完整回答
反對 回復 2021-09-24
  • 1 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號