一、包管理
-
Pypi(Python package Index):公共的模塊存儲中心,https://pypi.python.org/pypi
-
主要工具:distutils、setuptools、pip、wheel
-
使用?setup.py?打包?? ?? ? 在項目的根目錄下面創建?setup.py?文件?? ?? ? 在終端中運行?python setup.py –help[cmd1 cmd2]? ?可以查看命令的幫助?? ??? ??? ?from distutils.core import setup?? ??? ??? ?setup(name=’myname’,???????? ???version=’0.1.1′,???????? ???description=’magedu module’,? ?#?描述信息???????? ???author=’Pang Hao’,? ? ? ? ? ? author_email=’panghao@python.net‘,? ? ? ? ? ? url=’https://www.python.org/sigs/distutils-sig/‘,? ?#?包的主頁,可以不寫? ? ? ? ? ? packages=[‘m’]? #?指定?m,就會把?m?所有的非目錄子模塊打包?? ??? ?? ? #??packages=[‘m’, ‘m.m1.m2.m3’]? #?逐級建立目錄,但是只把?m?的所有非目錄子模塊打包,?把 m.m1.m2.m3?打包?????)?? ?? ? python?setup.py build? ?#?創建一個?build?目錄,會在項目目錄下多了?build?目錄,有一個?lib?子目錄,lib?下就是模塊?m?的目錄了,m?目錄下的 *.py?文件被復制了,但是子目錄沒有被復制
-
python setup.py install? #?如果沒有?build ,會先?build?編譯,然后安裝,也可以在?pip?里面看到
-
python?setup.py sdist? ?#??創建源代碼的分發包,會產生一個?dist?目錄,里面生成一個帶版本號的壓縮包。在其他地方解壓縮這個文件,里面有?setup.py,就可以使用?python setup.py install?安裝,也可以使用?pip?install m-0.1.0.zip?直接使用?pip?安裝這個壓縮包python setup.py bdist_wininst? ?#?制作?windows?下的分發包python setup.py bdist_rpm? #?打包成?rpm
-
wheel?包pip install wheelfrom setuptools import setup?? ??? ??? ?setup(name=’myname’,???????? ???version=’0.1.1′,???????? ???description=’magedu module’,? ?#?描述信息???????? ???author=’Pang Hao’,? ? ? ? ? ? author_email=’panghao@python.net‘,? ? ? ? ? ? url=’https://www.python.org/sigs/distutils-sig/‘,? ?#?包的主頁,可以不寫? ? ? ? ? ? packages=[‘m’]? #?指定?m,就會把?m?所有的非目錄子模塊打包?????)
二、異常處理
-
錯誤和異常:在高級編程語言中,一般都有錯誤和異常的概念,異常是可以捕獲,并被處理的,但是錯誤是不能被捕獲的。
-
產生異常:raise?語句顯式的拋出異常;Python?解釋器自己檢測到異常并引發它;? ? ?程序會在異常拋出的地方中斷執行,如果不捕獲,就會提前結束程序
-
raise?語句?? ??? ??? ?? ? raise?后什么都沒有,表示拋出最近一個被激活的異常,如果沒有被激活的異常,則拋類型異常,這種方式很少用?? ??? ??? ?? ? raise?后要求應該是?BaseException?類的子類或實例,如果是類,將被無參實例化
-
異常的捕獲try:? ? 待捕獲異常的代碼塊except [異常類型]:? ? 異常的處理代碼塊
-
異常類及繼承層次BaseException? ? SystemExit? ? KeyboardInterrupt? ? GeneratorExit? ? Exception?? ?? ? RuntimeError?? ??? ?? ? RecursionError?? ?? ? MemoryError?? ?? ? NameError?? ?? ? StopIteration?? ?? ? StopAsyncIteration?? ?? ? ArithmeticError?? ??? ?? ? FloatingPointError?? ??? ?? ? OverflowError?? ??? ?? ? ZeroDivisionError?? ?? ? LookupError?? ??? ?? ? IndexError?? ??? ?? ? KeyError?? ?? ? SyntaxError?? ?? ? OSError?? ??? ?? ? BlockingIOError?? ??? ?? ? ChildProcessError?? ??? ?? ? ConnectionError?? ??? ??? ?? ? BrokenPipeError?? ??? ??? ?? ? ConnectionAbortedError?? ??? ??? ?? ? ConnectionRefusedError?? ??? ??? ?? ? ConnectionResetError?? ??? ?? ? FileExistsError?? ??? ?? ? FileNotFoundError?? ??? ?? ? InterruptedError?? ??? ?? ? IsADirectoryError?? ??? ?? ? NotADirectoryError?? ??? ?? ? PermissionError?? ??? ?? ? ProcessLookupError?? ??? ?? ? TimeoutError
-
BaseException:所有內建異常類的基類是?BaseExceptionSystemExit:sys.exit()?函數引發的異常,異常捕獲處理,就直接交給?Python?解釋器,解釋器退出Exception:所有內建的、非系統退出的異常的基類,自定義異常應該繼承自它SyntaxError:語法錯誤,Python?將這種錯誤也歸到?Exception?下的子類,但是這種錯誤是不可捕獲的ArithmeticError:所有算術計算引發的異常,其子類有除零異常LookupError:使用映射的鍵或序列的索引無效時引發的異常的基類,比如?IndexError、KeyError自定義異常:從?Exception?繼承的類class MyException(Exception):????passtry:????raise MyException()except MyException:????print(‘Catch the exception’)
-
捕獲規則?? ?? ? 捕獲是從上到下依次比較,如果匹配,則執行匹配的?except?語句塊?? ?? ? 如果被一個?except?語句捕獲,其他?except?語句就不會再次捕獲了?? ?? ? 如果沒有任何一個?except?語句捕獲到這個異常,則該異常向外拋出捕獲的原則:從小到大,從具體到寬泛
-
finally?子句:最終,即最后一定要執行的,try…finally?語句塊中,不管是否發生了異常,都要執行?finally?的部分簡單的說,函數的返回值取決于最后一個執行的?return?語句,而?finally?則是?try…finally?中最后執行的語句塊
-
try?嵌套:內部捕獲不到異常,會向外層傳遞異常,但是如果內層有?finally?且有?return、break?語句,則異常就不會繼續向外拋出
-
沒有任何異常發生,則執行?else?子句
-
總結try:? ? <語句>? ? #?運行別的代碼except <異常類>:? ? <語句>? ? #?捕獲某種類型的異常except <異常類>?as <變量名>:? ? <語句>? ?#?捕獲某種類型的異常并獲得對象else:? ? <語句>? ?#?如果沒有異常發生finally:? ? <語句>? ?# 退出 try?時總會執行如果?try?中語句執行時發生異常,搜索?except?子句,并執行第一個匹配該異常的?except?子句;如果?try?中語句執行時發生異常,卻沒有匹配的?except?字句,異常將被遞交到外層的?try,如果外層不處理這個異常,異常將繼續向外層傳遞。如果都不處理該異常,則會傳遞到最外層,如果還沒有處理,就終止異常所在的線程;如果在?try?執行時沒有發生異常,將執行?else?子句中的語句;無論?try?中是否發生異常,finally?子句最終都會執行
-
層次結構代碼實現def exc_hierarchy(exc=BaseException, level=-1):????name = exc.__name__????if level == -1:????????print(name)????else:????????print(“{} +– {}”.format(‘????‘ * level, name))????for sub in exc.__subclasses__():????????exc_hierarchy(sub, level+1)exc_hierarchy()
-
NotImplemented?是個值,單值,是?NotImplementedType?類的實例NotImplementedError?是類型,是異常,返回?type不能用?raise?NotImplemented,用過用?raise?NotImplementedError
三、插件化開發
-
動態導入:運行時,根據用戶需求(提供字符串),找到模塊的資源動態加載起來
-
__import__(name, globals=None, locals=None, fromlist=(), level=0)name:模塊名import?語句本質上就是調用這個函數,但是不鼓勵直接使用它,建議使用 importlib.import_module( )sys = __import__(‘sys’)? 等價于?import?sys
-
importlib.import_module(name, package=None):支持絕對導入和相對導入,如果是相對導入,package?必須設置
-
插件化編程核心代碼實現# test1.pyclass A:????def showme(self):????????print(‘I am A’)# 主程序模塊 tets.pyimport importlibdef plugin_load(plugin_name:str, sep=”:”):????m, _, c = plugin_name.partition(sep)????mod = importlib.import_module(m)????cls = getattr(mod, c)????return cls()if __name__ = ‘__main__’:????a = plugin_load(‘test1:A’)????a.show
-
依賴的技術反射:運行時獲取類型的信息,可以動態維護類型數據動態?import:推薦使用?importlib?模塊,實現動態?import?模塊的能力多線程:可以開啟一個線程,等待用戶輸入,從而加載指定名稱的模塊
-
加載的時機程序啟動時:像?pycharm?這樣的工具,需要很多組件,這些組件可能是插件,啟動的時候掃描固定的目錄,加載插件程序運行中:程序運行過程中,接受用戶指令或請求,啟動相應的插件兩種方式各有利弊,如果插件過多,會導致程序啟動很慢,如果用戶需要時再加載,插件太大或者依賴多,插件也會啟動慢。所以先加載必須的,常用的插件,其他插件使用時,發現需要,動態載入。
-
接口和插件的區別接口往往是暴露出來的功能,例如模塊提供的函數或方法,加載模塊后調用這些函數完后功能。接口也是一種規范,它約定了必須實現的功能(必須提供某名稱的函數),但是不關心怎么實現這個功能。插件是把模塊加載到系統中,運行它,增強當前系統功能,或者提供系統不具備的功能,往往插件技術應用在框架設計中,系統本身設計簡單化、輕量級,實現基本功能后,其他功能通過插件加入進來,方便擴展。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99095