Python(2):建立函式模組

檳城碼農發表於2016-08-04

說明:

在使用python的時候我們除了使用內建的函式之外,可能還需要使用一些別人寫的函式。或者我們寫的程式碼也希望可以給其他人使用。要實現這樣的功能,我們就需要按照下面的步驟來定義自己的模組:

 

Step1:新建一個py檔案

首先我們將前面一章所寫的列印列表的函式儲存為一個.py檔案,假設我這裡儲存為 kider.py。

1 """
2 這是一個列印列表的函式,如果列表中有巢狀的列表也會展開列印出來
3 """
4 def print_list(movies):
5     if isinstance(movies, list):
6         for movie in movies:
7             print_list(movie)
8     else:
9         print(movies)

kider.py

如果要釋出的話,最好將函式快程式碼新增上註釋。在python裡面,三引號 “”” 中的字串表註釋,這個是多行註釋 ,單行註釋使用 # 。
這時候如果想使用該模組,最原始的辦法是將前面的kider.py檔案放入到本機的python模組地址。

如何知道本機的python模組放在哪,只需在IDLE(python控制檯)中輸入:

import sys

sys.path

sys.path的輸出就是本機的python模組所在的檔案

1 >>> import sys
2 >>> sys.path
3 [``, `/usr/local/lib/python3.5/dist-packages/redis-2.10.5-py3.5.egg`, `/usr/lib/python35.zip`, `/usr/lib/python3.5`, `/usr/lib/python3.5/plat-x86_64-linux-gnu`, `/usr/lib/python3.5/lib-dynload`, `/home/zyq/.local/lib/python3.5/site-packages`, `/usr/local/lib/python3.5/dist-packages`, `/usr/lib/python3/dist-packages`]

modulePath

 Step2:將py檔案作為模組安裝到本地
但其實我們不需要將自己寫的python模組放入本機的python模組地址,可以直接通過命令來安裝python模組到本機:
主要步驟如下:
》1.新建一個和準備安裝的python檔案同名的目錄,這裡取名為 kider,並且將前面的kider.py檔案放入該目錄下
》2. 在該目錄下建立一個setup.py檔案,並且編輯檔案的內容大致如下:

 1 from distutils.core import setup
 2 setup(
 3     name              = `kider`,
 4     version         = `1.0.0`,
 5     py_modules     = [`kider`],
 6     author        = `KiDe`,
 7     author_email    = `929557120@qq.com`,
 8     url        = `http://www.rampage.com`,
 9     description    = `KiDe`s first test module`,
10     )      

setup.py    

》3. 進入kider目錄,並且使用 python3 setup.py sdist 來進行編譯,編譯完成之後可以發現多了很多檔案和目錄
》4. 使用 sudo python3 setup.py install 命令安裝到本地的python模組。
》5. 接下來可以在程式中按如下方式使用python模組了:

1 import kider  
2 movies = ["haha", [1, 2, "Ha"], "movie2"];
3 kider.print_list(movies)

UseKider

為啥不能直接通過 print_list來使用剛剛釋出的python模組?

  這是因為預設的在python shell中的名稱空間是 __main__, 如果想要使用print_list 因為他是屬於 kider 名稱空間的,所以應該帶上該名稱空間。
不過當然你也可以使用和setup.py中的同樣的語法,將名稱空間中的方法引入進來,這樣你就可以直接使用方法名: form kider import print_list  
但是這樣存在一個風險,就是會覆蓋當前名稱空間的同名函式。

PS:注意到install之後其實在新生成的 __pycache__ 資料夾中多了一個 pyc檔案,該檔案可以當做是編譯後的class檔案,可以刪除,但是如果刪除,在執行的時候就可能損失掉對應的優化效能。
 

Step3:可選的把模組上傳到pypi
現在可以把模組上傳到pypi(python package index)上了:
》1. 首先需要去官網上註冊一個賬號  http://pypi.python.org
》2. python3 setup.py register   如果完成了第一步,那麼該步驟選則選項1, 否則其實該部也可以選擇2 進行直接新賬號建立註冊
》3. pyhton3 setup.py sdist upload  這一步進行將模組程式碼上傳

假設選擇了將程式碼上傳到高大上的pypi,那麼肯定需要對原來函式的功能進行改進,增加兩個引數,一個可以指定是否需要縮排,一個可以指定縮排時tab的個數。最終版本的程式碼如下:

 1 """ this is KiDe`s python module """
 2 
 3 """ 這個函式列印傳入的引數,如果傳入的引數是一個列表,則會依次列印列表中的項。
 4     支援多重巢狀的列表,會逐行依次列印出每一個巢狀列表中的所有子項。
 5 """
 6 # 第一個引數是輸入的準備用來輸出的物件,第二個參數列示如果物件中有子列表是否對子項採用縮排,第三個參數列示如果採用縮排,縮排的tab數量
 7 def print_list(args, level=0, indent=False):
 8     if isinstance(args, list):
 9         for arg in args:
10             print_list(arg, level+1, indent)
11     else:
12         if indent:
13             for tab_stop in range(level):
14                 print("	", end=``)
15         print(args)

kider.py

對於python指定了預設值的引數可以省略,比如可以直接指定第三個引數而不指定第二個引數的值,此時的呼叫方式如下:

1 >>> import kider
2 >>> kider.print_list([`aa`, `bb`, `cc`], indent=True)
3     aa
4     bb
5     cc

Invoke

 

黎明前最黑暗,成功前最絕望!


相關文章