亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python的動態(tài)重新封裝的教程

 更新時間:2015年04月11日 16:57:01   投稿:goldensun  
這篇文章主要介紹了Python的動態(tài)重新封裝的教程,本文來自于IBM的官方開發(fā)者文檔,需要的朋友可以參考下

讓我們描繪一下本文的情節(jié):假設您要在本地機器上運行一個進程,而部分程序邏輯卻在另一處。讓我們特別假設這個程序邏輯會不時更新, 而您運行進程時,希望使用最新的程序邏輯。有許多方法可以滿足剛提到的要求;本文將向您說明其中幾種方法。

隨著“可愛的 Python”專欄不斷進行,已經討論了我的公共域實用程序 Txt2Html 的正在進行的增強。該實用程序將“智能 ASCII”文本文件轉換成 HTML。以前的文章討論了實用程序的 Web 代理版本和實用程序的 curses 界面。同樣,我偶爾注意到可以用更有效的方法轉換某些 ASCII 標記,或者解決了一個在處理某個特殊標記結構中的錯誤。

事實上,本專欄的文章都是用 ASCII 編寫的,然后在編輯過程中轉換成您可以閱讀的 HTML 格式。在發(fā)表文章草稿之前,我運行了類似以下處理的程序:
文章的命令行 HTML 化

txt2html charming_python_7.txt > charming_python_7.html

如果愿意,我可以指定一些標志來修改操作;但不管怎樣,事實上轉換器的最新版本在我的本地驅動器和路徑中。如果在另一臺機器上工作,或者對于要使用該實用程序的讀者,則過程比較麻煩:請訪問我的網站,注意比較版本號和文件日期(有時更改太小,我不會更改版本號),下載當前版本、將當前版本復制到正確目錄,然后運行命令行轉換器。(請參閱本文后面的 參考資料。)

以上的過程包括幾個需要手工操作且比較費時的步驟。應該更簡單,而且可以做到這點。
命令行 Web 訪問

大多數人認為 Web 是在 GUI 環(huán)境中交互式瀏覽頁面的一種方法。那樣做當然很好,但命令行中也有許多功能。帶文本模式 Web 瀏覽器 lynx 的系統(tǒng)完全可以將整個 Web 看作是命令行工具使用的另一個文件集。例如,我發(fā)現有些命令很有用:
使用 lynx 進行命令行 Web 瀏覽

lynx -dump http://gnosis.cx/publish/.
lynx -dump http://ibm.com/developerworks/. > ibm_developer.txt
lynx -dump http://gnosis.cx/publish | wc | sed "s/( *[0-9]* *\)\([0-9]*\)\(.*\)/\2/g"

第一行說:“將 David Mertz 的主頁(以 ASCII 文本)顯示到控制臺?!钡诙姓f:“將 IBM 的當前 developerWorks 主頁的 ASCII 版本保存到文件?!钡谌惺纠f:“顯示 David 主頁的字數?!保ú槐負募毠?jié),它只顯示與管道結合的命令行工具。)

關于 lynx,有一點要注意它(使用 -dump 選項時)執(zhí)行幾乎與 Txt2Html 完全相反的操作:前一種工具將 HTML 轉換成文本;而后一種工具則轉換成其它格式。但沒有理由不使用與 lynx 一樣流行的 Txt2Html??梢允褂靡粋€很短的 Python 腳本完成這個操作:
'fetch_txt2html.py' 命令行轉換器

 import sys
 from urllib import urlopen, urlencode
 if len(sys.argv) == 2:
  cgi = 'http://gnosis.cx/cgi/txt2html.cgi'
  opts = urlencode({'source':sys.argv[1], 'proxy':'NONE'})
  print urlopen(cgi, opts).read()
       else:
  print "Please specify URL for Txt2Html conversion"

要運行這個腳本,只要執(zhí)行如下操作:

python fetch_txt2html.py http://gnosis.cx/publish/programming/charming_python_7.txt

這并沒有向您提供本地 Txt2Html 處理的全部開關,但如有必要,添加它們也很容易??梢韵袷褂萌魏蚊钚泄ぞ咭粯觼磔斔秃椭囟ㄏ蜉敵觥5?,在上述版本中,只能處理 URL 可以到達的數據文件,而不能處理本地文件。

實際上, fetch_txt2html.py 可以完成 lynx 不能完成的任務(Txt2Html 本身也不能):它不僅從 URL 取得數據源,而且還遠程獲取 程序邏輯 。如果使用 fetch_txt2html.py ,就 不必在本地機器上安裝 Txt2Html;將(使用最新版本)遠程調用處理,并且將把結果發(fā)送回來,就像運行的是本地進程。很棒吧?Txt2Html 的本地版本可以訪問遠程 URL,就像訪問本地文件一樣,但它還不能保證它自身是最新的……!

動態(tài)初始化

使用 fetch_txt2html.py 確保了在轉換中始終使用最新的程序邏輯。但是,這個方法可以完成的另一件事情是將處理器(和內存)的需求轉移給 gnosis.cx Web 服務器。此特殊進程的負載并不是特別高,但人們卻很可能認為在客戶機上處理的其它類型的進程會更有效且令人滿意。

組織 Txt2Html 的方式 -- 也就是組織大多數程序的方式 -- 是用一些由各種實用函數提供的核心流量控制函數。尤其是這些實用函數是一些經常更新的函數;核心函數( main() 和一些其它函數)只有在做重大改寫時才會變動??偠灾诿總€程序運行時有效更新的就是實用函數。其實,大部分情況下,主 Txt2Html 模塊 dmTxt2Html 中的大多數函數就夠了。
'd2h_textfuncs.py' 動態(tài) Txt2Html 更新

"""Hot-pluggable replacement functions for Txt2Html""" 
     #-- Functions to massage blocks by type 
#def 
     Titleify(block):
    #def Authorify(block):
    # ... [more block massaging functions] ... 
#-- Utility functions for text transformation 
#def AdjustCaps(txt):
    #def capwords(txt):
    #def URLify(txt):
    def Typographify 
    (txt):
  
    # [module] names 
  r = re.compile(r
    ""'([\(\s'/">]|^)\[(.*?)\]([<\s\.\),:;'"?!/-])""" , re.M | re.S)
  txt = r.sub(
    '\\1<em><code>\\2</code></em>\\3' ,txt)
  
    # *strongly emphasize* words 
  r = re.compile(r
    ""'([\(\s'/"]|^)\*(.*?)\*([\s\.\),:;'"?!/-])""" , re.M | re.S)
  txt = r.sub(
    '\\1<strong>\\2</strong>\\3' , txt)
  
    # ... [more text massaging] ... 
     
     return 
     
     txt
    # ... [more text transformation functions] .....

要使用最新和最具體的支持模塊,需要一些準備步驟。首先,將主 Txt2Html 模塊下載到本地系統(tǒng)(這是一次性步驟)。其次,在本地系統(tǒng)上創(chuàng)建類似于以下示例的 Python 腳本:
'dyn_txt2html.py' 命令行轉換器

from 
     dmTxt2Html 
    import 
     *   
    # Import the body of 'Txt2Html' code 
    
from 
     urllib 
    import 
     urlopen
    import 
     sys
    # Check for updated functions (fail gracefully if not fetchable) 
    
try 
    :
  updates = urlopen(
    'http://gnosis.cx/download/t2h_textfuncs.py' ).read()
  fh = open(
    't2h_textfuncs.py' , 
    'w' )
  fh.write(updates)
  fh.close()
    except 
    :
  sys.stderr.write(
    'Cannot currently download Txt2Html updates' )
    # Import the updated functions (if available) 
    
try 
    :
  
    from 
     t2h_textfuncs 
    import 
     *
    except 
    :
  sys.stderr.write(
    'Cannot import the updated Txt2Html functions' )
    # Set options based on runmode (shell vs. CGI) 
    
if 
     len(sys.argv) >= 2:
  cfg_dict = ParseArgs(sys.argv[1:])
  main(cfg_dict)
    else 
    :
  
    print"Please specify URL (and options) for Txt2Html conversion"

在 dyn_txt2html.py 腳本中,請注意當執(zhí)行 from t2h_textfuncs import * 語句時,所有以前在 dmTxt2Html 中定義的函數(如 Typographify() )都將由 t2h_textfuncs 版本的同名函數替換。當然,如果 t2h_textfuncs 的函數被注釋掉了,則不會被替換。

有件小問題得注意,不同的系統(tǒng)以不同的方式處理寫入 STDERR。在類 UNIX 系統(tǒng)中,運行腳本時可以重定向 STDERR;但是在當前 OS/2 外殼和 Windows/DOS 中,STDERR 消息將附加到控制臺輸出。您也許要將以上的錯誤/警告寫到日志文件中,或者只習慣于將 STDOUT 定向到文件(可能會更有用)。例如:
'dyn_txt2html' 的命令行會話

G:\txt2html> python dyn_txt2html.py test.txt > test.html
Cannot currently download Txt2Html updates

錯誤轉至控制臺;經轉換的輸出轉至文件。

一件更有趣的事情是 dyn_txt2html.py 為什么不下載整個 dmTxt2Html 模塊,而僅下載支持模塊。當然這是有理由的。 t2h_textfuncs 支持模塊遠遠小于主 dmTxt2Html 模塊,特別是因為大多數函數已經過刪節(jié)/被注釋掉。在調制解調器連接上,它的速度明顯快很多。但下載大小并不是主要原因。

對于 Txt2Html,如果用戶自動下載整個最新模塊也沒關系。但程序邏輯是 分布式 的系統(tǒng)(特別是維護責任也是分布式的)會發(fā)生什么情況呢?您也許會讓 Alice、Bob 和 Charlie 分別負責模塊 Funcs_A 、 Funcs_B 和 Funcs_C 。他們每個人都對他們負責的函數進行定期(且獨立)更改,并將最新和最好的版本上傳到他們自己的網站(如 http://alice.com/Funcs_A.py)。在這種情況下,讓三個程序員都更改同一個主模塊不太可行。但可以直接擴展類似于 dyn_txt2html.py 的腳本以在啟動時嘗試導入 Funcs_A 、 Funcs_B 和 Funcs_C (如果不能獲取這些資源,則會退到 MainProg 版本)。

長期運行的動態(tài)進程

迄今為止,我們研究的工具已經通過在初始化時下載更新資源而獲得了動態(tài)程序邏輯。這對于命令行處理或批處理很有意義,但對于長期運行的應用程序又會怎樣。這種長期運行的應用程序最可能是一些不斷響應客戶機請求的服務器進程。但是在這個案例中,我們將使用為 以前的文章 開發(fā)的 curses_txt2html.py 來說明 Python 的 reload() 函數。程序 curses_txt2html 是 dmTxt2Html 本地副本的封裝器。這里并不是第二次提到 curses 編程,談一下 curses_txt2html 提供了一組交互式菜單以配置和運行多個連續(xù)的 Txt2Html 轉換也足夠了。

curses_txt2html 可以一直在后臺運行,當切換到它的會話并運行轉換時,我們希望它能夠使用最新的程序邏輯。對于這個特定的簡單示例,關閉和重新啟動應用程序并不難,并不會帶來特別的損害。但這很容易令人聯想到其它一直運行著的進程(可能是說明會話中所執(zhí)行操作狀態(tài)的進程)。

在本文中,添加了新的 File/Update 子菜單。它被激活時只調用新的函數 update_txt2html() 。除了與提供發(fā)生的確認相關的 curses 調用之外,我們已經在本文的其它示例中看到過這些步驟:
'curses_txt2html.py' 動態(tài)更新函數

def update_txt2html 
    ():
  
    # Check for updated functions (fail gracefully if not fetchable) 
  s = curses.newwin(6, 60, 4, 5)
 s.box()
  s.addstr(1, 2, 
    "* PRESS ANY KEY TO CONTINUE *" , curses.A_BOLD)
 s.addstr(3,2, 
    "...downloading..." )
 s.refresh()
  
    try 
    :
    
    from 
     urllib 
    import 
     urlopen
    updates = urlopen(
    'http://gnosis.cx/download/dmTxt2Html.py' ).read()
    fh = open(
    'dmTxt2Html.py' , 
    'w' )
    fh.write(updates)
    fh.close()
 s.addstr(3,2, 
    "Module [dmTxt2Html] downloaded to current directory" )
  
    except 
    :
 s.addstr(3,2, 
    "Download of updated [dmTxt2Html] module failed!" )
  reload(dmTxt2Html)
  s.addstr(4, 2, 
    "Module [dmTxt2Html] reloaded from current directory " )
 s.refresh()
 c = s.getch()
   s.erase()

dyn_txthtml.py 和 update_txt2html() 函數之間有兩個重要差異。其中一個差異是繼續(xù)操作,并導入主 dmTxt2Html 模塊而不只導入支持函數。這主要是簡化了導入。這里的問題是我們使用 import dmTxt2Html 來訪問模塊,而不是 from dmTxt2Html import * 。從許多方面考慮,這是一個更安全的過程,但結果是使覆蓋 dmTxt2Html 中的函數變得更困難(不論是無心地還是故意地)。如果我們要從 d2h_textfuncs 附加函數,則必須對導入的支持模塊執(zhí)行 dir() ,并將成員以屬性形式附加到 "dmTxt2Html" 名稱空間。執(zhí)行這種樣式的覆蓋是留給讀者的練習。

update_txt2html() 函數帶來的最主要差異是 Python 的內置 reload() 函數的用法。只執(zhí)行全新的 import dmTxt2Html 將 不 會覆蓋以前導入的函數。請密切注意這一點!許多初學者認為重新導入模塊將更新內存中的版本。這是錯的。實際上,更新模塊中函數的內存映像的方法是 reload() 模塊。

以上示例中還執(zhí)行了另一個小技巧。更新 dmTxt2Html 模塊的下載位置是本地工作目錄,而這個目錄可能是(也可能不是)原來裝入 dmTxt2Html 的目錄。事實上,如果它在 Python 庫目錄中,那么您也許不在該目錄中使用(也許對它沒有用戶許可權)。但 reload() 調用嘗試先從當前目錄裝入,然后再嘗試 Python 路徑的其余部分。所以,不論下載是否成功, reload() 應該是一個安全的操作(雖然它可能裝入新的模塊,也可能不裝入)。

相關文章

  • django如何實現視圖重定向

    django如何實現視圖重定向

    這篇文章主要介紹了django如何實現視圖重定向,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 詳解如何從TensorFlow的mnist數據集導出手寫體數字圖片

    詳解如何從TensorFlow的mnist數據集導出手寫體數字圖片

    這篇文章主要介紹了詳解如何從TensorFlow的mnist數據集導出手寫體數字圖片,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 利用Python實現RSA加密解密方法實例

    利用Python實現RSA加密解密方法實例

    過去幾天我一直在嘗試用Python實現RSA算法,下面這篇文章主要給大家介紹了關于利用Python實現RSA加密解密的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • python數據批量寫入ScrolledText的優(yōu)化方法

    python數據批量寫入ScrolledText的優(yōu)化方法

    今天小編就為大家分享一篇python數據批量寫入ScrolledText的優(yōu)化方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python方法的延遲加載的示例代碼

    Python方法的延遲加載的示例代碼

    本篇文章主要介紹了Python方法的延遲加載的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • python讀取視頻流提取視頻幀的兩種方法

    python讀取視頻流提取視頻幀的兩種方法

    這篇文章主要為大家詳細介紹了python讀取視頻流提取視頻幀的兩種方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 淺談如何使用Python控制手機(二)

    淺談如何使用Python控制手機(二)

    這篇文章主要為大家介紹了如何使用Python控制手機,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • pycharm三個有引號不能自動生成函數注釋的問題

    pycharm三個有引號不能自動生成函數注釋的問題

    這篇文章主要介紹了解決pycharm三個有引號不能自動生成函數注釋的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Python 導入文件過程圖解

    Python 導入文件過程圖解

    這篇文章主要介紹了Python 導入文件過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 詳解python進行mp3格式判斷

    詳解python進行mp3格式判斷

    這篇文章主要介紹了詳解python進行mp3格式判斷,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12

最新評論