国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領取全套視頻
            千鋒教育

            關注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術干貨  > Python上下文管理器

            Python上下文管理器

            來源:千鋒教育
            發(fā)布人:xqq
            時間: 2023-11-07 19:37:35 1699357055

            本節(jié)嚴格意義上并非新的重定向方式,而是利用Pyhton上下文管理器優(yōu)化上節(jié)的代碼實現(xiàn)。借助于上下文管理器語法,可不必向重定向使用者暴露sys.stdout。

            首先考慮輸出抑制,基于上下文管理器語法實現(xiàn)如下:

            importsys,cStringIO,contextlib

            classDummyFile:

            defwrite(self,outStr):pass

            @contextlib.contextmanager

            defMuteStdout():

            savedStdout=sys.stdout

            sys.stdout=cStringIO.StringIO()#DummyFile()

            try:

            yield

            exceptException:#捕獲到錯誤時,屏顯被抑制的輸出(該處理并非必需)

            content,sys.stdout=sys.stdout,savedStdout

            printcontent.getvalue()#;raise

            #finally:

            sys.stdout=savedStdout

            使用示例如下:

            withMuteStdout():

            print"I'llshowupwhenisexecuted!"#不屏顯不寫入

            raise#屏顯上句

            print"I'mhidingmyselfsomewhere:)"#不屏顯

            再考慮更通用的輸出重定向:

            importos,sys

            fromcontextlibimportcontextmanager

            @contextmanager

            defRedirectStdout(newStdout):

            savedStdout,sys.stdout=sys.stdout,newStdout

            try:

            yield

            finally:

            sys.stdout=savedStdout

            使用示例如下:

            defGreeting():print'Hello,boss!'

            withopen('out.txt',"w+")asfile:

            print"I'mwritingtoyou..."#屏顯

            withRedirectStdout(file):

            print'Ihopethisletterfindsyouwell!'#寫入文件

            print'Checkyourmailbox.'#屏顯

            withopen(os.devnull,"w+")asfile,RedirectStdout(file):

            Greeting()#不屏顯不寫入

            print'Ideserveapayraise:)'#不屏顯不寫入

            print'DidyouhearwhatIsaid?'#屏顯

            可見,with內(nèi)嵌塊里的函數(shù)和print語句輸出均被重定向。注意,上述示例不是線程安全的,主要適用于單線程。

            當函數(shù)被頻繁調(diào)用時,建議使用裝飾器包裝該函數(shù)。這樣,僅需修改該函數(shù)定義,而無需在每次調(diào)用該函數(shù)時使用with語句包裹。示例如下:

            importsys,cStringIO,functools

            defMuteStdout(retCache=False):

            defdecorator(func):

            @functools.wraps(func)

            defwrapper(*args,**kwargs):

            savedStdout=sys.stdout

            sys.stdout=cStringIO.StringIO()

            try:

            ret=func(*args,**kwargs)

            ifretCache==True:

            ret=sys.stdout.getvalue().strip()

            finally:

            sys.stdout=savedStdout

            returnret

            returnwrapper

            returndecorator

            若裝飾器MuteStdout的參數(shù)retCache為真,外部調(diào)用func()函數(shù)時將返回該函數(shù)內(nèi)部print輸出的內(nèi)容(可供屏顯);若retCache為假,外部調(diào)用func()函數(shù)時將返回該函數(shù)的返回值(抑制輸出)。

            MuteStdout裝飾器使用示例如下:

            @MuteStdout(True)

            defExclaim():print'Iamproudofmyself!'

            @MuteStdout()

            defMumble():print'Ilackconfidence...';return'sad'

            printExclaim(),Exclaim.__name__#屏顯'Iamproudofmyself!Exclaim'

            printMumble(),Mumble.__name__#屏顯'sadMumble'

            在所有線程中,被裝飾函數(shù)執(zhí)行期間,sys.stdout都會被MuteStdout裝飾器劫持。而且,函數(shù)一經(jīng)裝飾便無法移除裝飾。因此,使用該裝飾器時應慎重考慮場景。

            接著,考慮創(chuàng)建RedirectStdout裝飾器:

            defRedirectStdout(newStdout=sys.stdout):

            defdecorator(func):

            defwrapper(*args,**kwargs):

            savedStdout,sys.stdout=sys.stdout,newStdout

            try:

            returnfunc(*args,**kwargs)

            finally:

            sys.stdout=savedStdout

            returnwrapper

            returndecorator

            使用示例如下:

            file=open('out.txt',"w+")

            @RedirectStdout(file)

            defFunNoArg():print'Noargument.'

            @RedirectStdout(file)

            defFunOneArg(a):print'Oneargument:',a

            defFunTwoArg(a,b):print'Twoarguments:%s,%s'%(a,b)

            FunNoArg()#寫文件'Noargument.'

            FunOneArg(1984)#寫文件'Oneargument:1984'

            RedirectStdout()(FunTwoArg)(10,29)#屏顯'Twoarguments:10,29'

            printFunNoArg.__name__#屏顯'wrapper'(應顯示'FunNoArg')

            file.close()

            注意FunTwoArg()函數(shù)的定義和調(diào)用與其他函數(shù)的不同,這是兩種等效的語法。此外,RedirectStdout裝飾器的最內(nèi)層函數(shù)wrapper()未使用"functools.wraps(func)"修飾,會丟失被裝飾函數(shù)原有的特殊屬性(如函數(shù)名、文檔字符串等)。

            以上內(nèi)容為大家介紹了Python上下文管理器,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。

            tags: python培訓
            聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
            10年以上業(yè)內(nèi)強師集結,手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
            免費領取
            今日已有369人領取成功
            劉同學 138****2860 剛剛成功領取
            王同學 131****2015 剛剛成功領取
            張同學 133****4652 剛剛成功領取
            李同學 135****8607 剛剛成功領取
            楊同學 132****5667 剛剛成功領取
            岳同學 134****6652 剛剛成功領取
            梁同學 157****2950 剛剛成功領取
            劉同學 189****1015 剛剛成功領取
            張同學 155****4678 剛剛成功領取
            鄒同學 139****2907 剛剛成功領取
            董同學 138****2867 剛剛成功領取
            周同學 136****3602 剛剛成功領取
            相關推薦HOT