91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    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內嵌塊里的函數(shù)和print語句輸出均被重定向。注意,上述示例不是線程安全的,主要適用于單線程。

      當函數(shù)被頻繁調用時,建議使用裝飾器包裝該函數(shù)。這樣,僅需修改該函數(shù)定義,而無需在每次調用該函數(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為真,外部調用func()函數(shù)時將返回該函數(shù)內部print輸出的內容(可供屏顯);若retCache為假,外部調用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ù)的定義和調用與其他函數(shù)的不同,這是兩種等效的語法。此外,RedirectStdout裝飾器的最內層函數(shù)wrapper()未使用"functools.wraps(func)"修飾,會丟失被裝飾函數(shù)原有的特殊屬性(如函數(shù)名、文檔字符串等)。

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

      tags: python培訓
      聲明:本站稿件版權均屬千鋒教育所有,未經(jīng)許可不得擅自轉載。
      10年以上業(yè)內強師集結,手把手帶你蛻變精英
      請您保持通訊暢通,專屬學習老師24小時內將與您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