天天看點

Python(2):建立函數子產品

說明:

在使用python的時候我們除了使用内置的函數之外,可能還需要使用一些别人寫的函數。或者我們寫的代碼也希望可以給其他人使用。要實作這樣的功能,我們就需要按照下面的步驟來定義自己的子產品:

Step1:建立一個py檔案

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

Python(2):建立函數子產品
Python(2):建立函數子產品

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子產品所在的檔案

Python(2):建立函數子產品
Python(2):建立函數子產品
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檔案,并且編輯檔案的内容大緻如下:

Python(2):建立函數子產品
Python(2):建立函數子產品
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子產品了:

Python(2):建立函數子產品
Python(2):建立函數子產品
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的個數。最終版本的代碼如下:

Python(2):建立函數子產品
Python(2):建立函數子產品
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指定了預設值的參數可以省略,比如可以直接指定第三個參數而不指定第二個參數的值,此時的調用方式如下:

Python(2):建立函數子產品
Python(2):建立函數子產品
1 >>> import kider
2 >>> kider.print_list(['aa', 'bb', 'cc'], indent=True)
3     aa
4     bb
5     cc      

Invoke

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