淺談使用Python內建函數getattr實現分發模式,pythongetattr

來源:互聯網
上載者:User

淺談使用Python內建函數getattr實現分發模式,pythongetattr

本文研究的主要是使用Python內建函數getattr實現分發模式的相關問題,具體介紹如下。

getattr 常見的使用模式是作為一個分發者。舉個例子,如果你有一個程式可以以不同的格式輸出資料,你可以為每種輸出格式定義各自的格式輸出函數,然後使用唯一的分發函數調用所需的格式輸出函數。

例如,讓我們假設有一個以 HTML、XML 和普通文字格式設定列印網站統計的程式。輸出格式在命令列中指定,或者儲存在設定檔中。statsout 模組定義了三個函數:output_htmloutput_xml output_text。然後主程式定義了唯一的輸出函數,如下:

import statsoutdef output(data, format="text"):                 output_function = getattr(statsout, "output_%s" % format)   return output_function(data)     

output 函數接收一個必備參數 data,和一個選擇性參數 format。如果沒有指定 format 參數,其預設值是 text 並完成普通文本輸出函數的調用。

你可以串連 format 參數值和 "output_" 來建立一個函數名稱作為參數值,然後從 statsout 模組中取得該函數。這種方式允許今後很容易的擴充程式以支援其它的輸出格式,而且無需修改分發函數。所要做的僅僅是向 statsout 中添加一個函數,比如 output_pdf,之後只要將 “pdf” 作為 format 的參數值傳遞給 output 函數即可。

現在你可以簡單的調用輸出函數就像調用其它函數一樣了。output_function 變數是指向 statsout 模組中相應函數的引用。

你是否發現前面樣本的一個 Bug?即字串和函數之間的松耦合,而且沒有錯誤檢查。如果使用者傳入一個格式參數,但是在 statsout 中沒有定義相應的格式輸出函數,會發生什麼呢?還好,getattr 會返回 None,它會取代一個有效函數並被賦值給 output_function,然後下一行調用函數的語句將會失敗並拋出一個異常。這種方式不好。值得慶幸的是,getattr 能夠使用可選的第三個參數,一個預設傳回值。

總結

以上就是本文關於淺談使用Python內建函數getattr實現分發模式的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.