Python 部分知識點總結(九)

此篇博客只是記錄第十一周未掌握或不熟悉的知識點,用來加深印象。

一、包管理

  1. Pypi(Python package Index):公共的模塊存儲中心,https://pypi.python.org/pypi
  2. 主要工具:distutils、setuptools、pip、wheel
  3. 使用?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?文件被復制了,但是子目錄沒有被復制
  4. python setup.py install? #?如果沒有?build ,會先?build?編譯,然后安裝,也可以在?pip?里面看到
  5. 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
  6. wheel?包
    pip install wheel
    from 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?所有的非目錄子模塊打包
    ?????)

二、異常處理

  1. 錯誤和異常:在高級編程語言中,一般都有錯誤和異常的概念,異常是可以捕獲,并被處理的,但是錯誤是不能被捕獲的。
  2. 產生異常:raise?語句顯式的拋出異常;Python?解釋器自己檢測到異常并引發它;
    ? ? ?程序會在異常拋出的地方中斷執行,如果不捕獲,就會提前結束程序
  3. raise?語句
    ?? ??? ??? ?? ? raise?后什么都沒有,表示拋出最近一個被激活的異常,如果沒有被激活的異常,則拋類型異常,這種方式很少用
    ?? ??? ??? ?? ? raise?后要求應該是?BaseException?類的子類或實例,如果是類,將被無參實例化
  4. 異常的捕獲
    try:
    ? ? 待捕獲異常的代碼塊
    except [異常類型]:
    ? ? 異常的處理代碼塊
  5. 異常類及繼承層次
    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
  6. BaseException:所有內建異常類的基類是?BaseException
    SystemExit:sys.exit()?函數引發的異常,異常捕獲處理,就直接交給?Python?解釋器,解釋器退出
    Exception:所有內建的、非系統退出的異常的基類,自定義異常應該繼承自它
    SyntaxError:語法錯誤,Python?將這種錯誤也歸到?Exception?下的子類,但是這種錯誤是不可捕獲的
    ArithmeticError:所有算術計算引發的異常,其子類有除零異常
    LookupError:使用映射的鍵或序列的索引無效時引發的異常的基類,比如?IndexError、KeyError
    自定義異常:從?Exception?繼承的類
    class MyException(Exception):
    ????pass
    try:
    ????raise MyException()
    except MyException:
    ????print(‘Catch the exception’)
  7. 捕獲規則
    ?? ?? ? 捕獲是從上到下依次比較,如果匹配,則執行匹配的?except?語句塊
    ?? ?? ? 如果被一個?except?語句捕獲,其他?except?語句就不會再次捕獲了
    ?? ?? ? 如果沒有任何一個?except?語句捕獲到這個異常,則該異常向外拋出
    捕獲的原則:從小到大,從具體到寬泛
  8. finally?子句:最終,即最后一定要執行的,try…finally?語句塊中,不管是否發生了異常,都要執行?finally?的部分
    簡單的說,函數的返回值取決于最后一個執行的?return?語句,而?finally?則是?try…finally?中最后執行的語句塊
  9. try?嵌套:內部捕獲不到異常,會向外層傳遞異常,但是如果內層有?finally?且有?return、break?語句,則異常就不會繼續向外拋出
  10. 沒有任何異常發生,則執行?else?子句
  11. 總結
    try:
    ? ? <語句>? ? #?運行別的代碼
    except <異常類>:
    ? ? <語句>? ? #?捕獲某種類型的異常
    except <異常類>?as <變量名>:
    ? ? <語句>? ?#?捕獲某種類型的異常并獲得對象
    else:
    ? ? <語句>? ?#?如果沒有異常發生
    finally:
    ? ? <語句>? ?# 退出 try?時總會執行
    如果?try?中語句執行時發生異常,搜索?except?子句,并執行第一個匹配該異常的?except?子句;
    如果?try?中語句執行時發生異常,卻沒有匹配的?except?字句,異常將被遞交到外層的?try,如果外層不處理這個異常,異常將繼續向外層傳遞。如果都不處理該異常,則會傳遞到最外層,如果還沒有處理,就終止異常所在的線程;
    如果在?try?執行時沒有發生異常,將執行?else?子句中的語句;
    無論?try?中是否發生異常,finally?子句最終都會執行
  12. 層次結構代碼實現
    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()
  13. NotImplemented?是個值,單值,是?NotImplementedType?類的實例
    NotImplementedError?是類型,是異常,返回?type
    不能用?raise?NotImplemented,用過用?raise?NotImplementedError

三、插件化開發

  1. 動態導入:運行時,根據用戶需求(提供字符串),找到模塊的資源動態加載起來
  2. __import__(name, globals=None, locals=None, fromlist=(), level=0)
    name:模塊名
    import?語句本質上就是調用這個函數,但是不鼓勵直接使用它,建議使用 importlib.import_module( )
    sys = __import__(‘sys’)? 等價于?import?sys
  3. importlib.import_module(name, package=None):支持絕對導入和相對導入,如果是相對導入,package?必須設置
  4. 插件化編程核心代碼實現
    # test1.py
    class A:
    ????def showme(self):
    ????????print(‘I am A’)
    # 主程序模塊 tets.py
    import importlib
    def 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
  5. 依賴的技術
    反射:運行時獲取類型的信息,可以動態維護類型數據
    動態?import:推薦使用?importlib?模塊,實現動態?import?模塊的能力
    多線程:可以開啟一個線程,等待用戶輸入,從而加載指定名稱的模塊
  6. 加載的時機
    程序啟動時:像?pycharm?這樣的工具,需要很多組件,這些組件可能是插件,啟動的時候掃描固定的目錄,加載插件
    程序運行中:程序運行過程中,接受用戶指令或請求,啟動相應的插件
    兩種方式各有利弊,如果插件過多,會導致程序啟動很慢,如果用戶需要時再加載,插件太大或者依賴多,插件也會啟動慢。
    所以先加載必須的,常用的插件,其他插件使用時,發現需要,動態載入。
  7. 接口和插件的區別
    接口往往是暴露出來的功能,例如模塊提供的函數或方法,加載模塊后調用這些函數完后功能。
    接口也是一種規范,它約定了必須實現的功能(必須提供某名稱的函數),但是不關心怎么實現這個功能。
    插件是把模塊加載到系統中,運行它,增強當前系統功能,或者提供系統不具備的功能,往往插件技術應用在框架設計中,系統本身設計簡單化、輕量級,實現基本功能后,其他功能通過插件加入進來,方便擴展。

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99095

(0)
龐豪龐豪
上一篇 2018-05-21
下一篇 2018-05-21

相關推薦

  • 樹 概念


    二叉樹

    2018-04-16
  • queue,threading,user_agents

    queue 模塊 隊列
    threading 模塊 線程
    user_agents 瀏覽器信息提取

    2018-05-07
  • 解析式

    列表解析式和字典解析式 datetime模塊 對日期,時間,時間戳的處理 datetime類 today()返回本地時區當前的datetime對象 now(tz=None)返回當前時間的datetime對象,時間到微秒,如果tz為None,返回和today()一樣 utcnow()沒有時區的當前時間 fromtimestamp(timestamp,tz=Zo…

    2018-04-09
  • 樹 非線性結構,每個元素都可以有多個前驅和后繼 樹是n(n>=0)個元素 n = 0時,稱為空樹 樹只有一個特殊的沒有前驅的元素,稱為樹的根root 樹中除了根結點,其余元素只能有一個前驅,可以有0個或者多個后繼 遞歸定義 樹T是n(n>=0)個元素的集合,n=0時,稱為空樹 有且只有一個特殊元素根,剩余元素都可以被劃分為m個互不相交的集合T1,…

    2018-04-16
  • 正則表達式

    正則表達式

    Python筆記 2018-05-03
  • Ipython封裝解構

    IPython Shell命令 !command 執行shell命令 !ls -l , !touch a.txt file = !ls -l | grep py 魔術方法 使用%開頭的,IPython內置的特殊方法 %magic 格式 %開頭是line magic %% 開頭是cell magic,notebook的cell %alias 定義一個系統命令的…

    2018-04-09
欧美性久久久久