最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

隨著“可愛的 Python”專欄不斷進(jìn)行,已經(jīng)討論了我的公共域?qū)嵱贸绦?Txt2Html 的正在進(jìn)行的增強。該實用程序?qū)ⅰ爸悄?ASCII”文本文件轉(zhuǎn)換成 HTML。以前的文章討論了實用程序的 Web 代理版本和實用程序的 curses 界面。同樣,我偶爾注意到可以用更有效的方法轉(zhuǎn)換某些 ASCII 標(biāo)記,或者解決了一個在處理某個特殊標(biāo)記結(jié)構(gòu)中的錯誤。

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

txt2html charming_python_7.txt > charming_python_7.html

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

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

大多數(shù)人認(rèn)為 Web 是在 GUI 環(huán)境中交互式瀏覽頁面的一種方法。那樣做當(dāng)然很好,但命令行中也有許多功能。帶文本模式 Web 瀏覽器 lynx 的系統(tǒng)完全可以將整個 Web 看作是命令行工具使用的另一個文件集。例如,我發(fā)現(xiàn)有些命令很有用:
使用 lynx 進(jìn)行命令行 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 文本)顯示到控制臺。”第二行說:“將 IBM 的當(dāng)前 developerWorks 主頁的 ASCII 版本保存到文件?!钡谌惺纠f:“顯示 David 主頁的字?jǐn)?shù)?!保ú槐?fù)?dān)心細(xì)節(jié),它只顯示與管道結(jié)合的命令行工具。)

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

 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 處理的全部開關(guān),但如有必要,添加它們也很容易??梢韵袷褂萌魏蚊钚泄ぞ咭粯觼磔斔秃椭囟ㄏ蜉敵?。但是,在上述版本中,只能處理 URL 可以到達(dá)的數(shù)據(jù)文件,而不能處理本地文件。

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

動態(tài)初始化

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

組織 Txt2Html 的方式 -- 也就是組織大多數(shù)程序的方式 -- 是用一些由各種實用函數(shù)提供的核心流量控制函數(shù)。尤其是這些實用函數(shù)是一些經(jīng)常更新的函數(shù);核心函數(shù)( main() 和一些其它函數(shù))只有在做重大改寫時才會變動。總而言之,在每個程序運行時有效更新的就是實用函數(shù)。其實,大部分情況下,主 Txt2Html 模塊 dmTxt2Html 中的大多數(shù)函數(shù)就夠了。
'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] .....

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

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 腳本中,請注意當(dāng)執(zhí)行 from t2h_textfuncs import * 語句時,所有以前在 dmTxt2Html 中定義的函數(shù)(如 Typographify() )都將由 t2h_textfuncs 版本的同名函數(shù)替換。當(dāng)然,如果 t2h_textfuncs 的函數(shù)被注釋掉了,則不會被替換。

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

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

錯誤轉(zhuǎn)至控制臺;經(jīng)轉(zhuǎn)換的輸出轉(zhuǎn)至文件。

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 使用python list 查找所有匹配元素的位置實例

    使用python list 查找所有匹配元素的位置實例

    今天小編就為大家分享一篇使用python list 查找所有匹配元素的位置實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python如何爬取qq音樂歌詞到本地

    Python如何爬取qq音樂歌詞到本地

    這篇文章主要介紹了Python如何爬取qq音樂歌詞到本地,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制

    Python+seaborn實現(xiàn)聯(lián)合分布圖的繪制

    聯(lián)合分布(Joint Distribution)圖是一種查看兩個或兩個以上變量之間兩兩相互關(guān)系的可視化圖,在數(shù)據(jù)分析操作中經(jīng)常需要用到。本文將通過seaborn實現(xiàn)繪制聯(lián)合分布圖,需要的可以參考一下
    2023-02-02
  • Python中語音轉(zhuǎn)文字相關(guān)庫介紹(最新推薦)

    Python中語音轉(zhuǎn)文字相關(guān)庫介紹(最新推薦)

    Python的speech_recognition庫是一個用于語音識別的Python包,它可以使Python程序能夠識別和翻譯來自麥克風(fēng)、音頻文件或網(wǎng)絡(luò)流的語音,這篇文章主要介紹了Python中語音轉(zhuǎn)文字相關(guān)庫介紹,需要的朋友可以參考下
    2023-05-05
  • Python面向?qū)ο蠓庋b繼承和多態(tài)示例講解

    Python面向?qū)ο蠓庋b繼承和多態(tài)示例講解

    這篇文章給大家介紹了python面向?qū)ο蟮娜筇卣鳎悍庋b,繼承,多態(tài)的相關(guān)知識,通過實例代碼講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • python繪制風(fēng)場方向和大小quiver問題

    python繪制風(fēng)場方向和大小quiver問題

    這篇文章主要介紹了python繪制風(fēng)場方向和大小quiver問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 使用Python的數(shù)據(jù)可視化庫Matplotlib實現(xiàn)折線圖

    使用Python的數(shù)據(jù)可視化庫Matplotlib實現(xiàn)折線圖

    數(shù)據(jù)可視化是數(shù)據(jù)分析和探索中不可或缺的一環(huán),本文將介紹如何使用Python中的數(shù)據(jù)可視化庫Matplotlib,通過示例代碼實現(xiàn)一個簡單的折線圖,感興趣的同學(xué)可以參考閱讀下
    2023-07-07
  • 解決PDF 轉(zhuǎn)圖片時丟文字的一種可能方式

    解決PDF 轉(zhuǎn)圖片時丟文字的一種可能方式

    這篇文章主要介紹了解決PDF 轉(zhuǎn)圖片時丟字的一種可能方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python中 ? : 三元表達(dá)式的使用介紹

    python中 ? : 三元表達(dá)式的使用介紹

    剛剛學(xué)python的時候,時常糾結(jié)于python中沒有C語言中 ? : 的實現(xiàn),今天終于發(fā)現(xiàn)了兩種python的實現(xiàn)方式
    2013-10-10
  • python中List的sort方法指南

    python中List的sort方法指南

    我們需要對List進(jìn)行排序,Python提供了兩個方法:1.用List的成員函數(shù)sort進(jìn)行排序;2.用built-in函數(shù)sorted進(jìn)行排序,今天我們就來探討下這2個方法
    2014-09-09

最新評論

玉溪市| 东阿县| 兰州市| 迭部县| 大姚县| 辽阳县| 佛坪县| 迁安市| 惠安县| 封开县| 秦安县| 鲁山县| 安丘市| 叙永县| 大关县| 垫江县| 威远县| 白玉县| 织金县| 元谋县| 黔西县| 衡阳市| 文水县| 隆子县| 宁陵县| 寿阳县| 凤冈县| 保德县| 金阳县| 蚌埠市| 青海省| 黄石市| 体育| 扬州市| 于田县| 应城市| 宝坻区| 南岸区| 介休市| 滁州市| 惠来县|