說明:
在使用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 = '[email protected]',
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("\t", end='')
15 print(args)
對于python指定了預設值的參數可以省略,比如可以直接指定第三個參數而不指定第二個參數的值,此時的調用方式如下:

1 >>> import kider
2 >>> kider.print_list(['aa', 'bb', 'cc'], indent=True)
3 aa
4 bb
5 cc
Invoke
黎明前最黑暗,成功前最絕望!