Python入門到逆襲9(進階篇3)
技術標籤:python入門到逆襲pythonhttplinuxredismysql
1.模組和包
模組:
Python中的一個Module對應的就是一個.py檔案。其中定義的所有函式或者是變數都屬於這個Module。這個Module 對於所有函式而言就相當於一個全域性的名稱空間。而每個函式又都有自己區域性的名稱空間。
包:
包,即所謂Package, 就是一堆module的集合,也就一堆.py檔案,這一對module都是有這一類相似相關功能的功能的,而不是一堆毫無關係的module。
備註:一個好的模組和包,不在於你會不會定義和使用模組和包,而在於怎麼去設計好,在很多專案中,第一步是瞭解需求(就是要做什麼,做到什麼程度),第二步就是做模組設計文件,設計文件中一個章節就專門來設計包和模組的。
舉個栗子:
例如定義一個param_check.py模組,從這個param_check模組名來看,最容易聯想到的是什麼呢?應該見名知意,就是做引數校驗的,例如變數型別校驗、是否為空的校驗、是否超過預定的上下範圍之類的。
例如定義一個common的包,也是見名知意,這個包主要用來存放一些公共模組,例如是上面的param_check、ip引數的校驗ip_check等,都屬於一些公共的模組,可以被其它模組引用呼叫。
如果在common包裡面放一個user_table_mysql模組是否合適呢,可能就不合適,資料庫某個表的操作,應該專門定義一個數據庫操作的db層,每個表的操作都在db層下建立一個模組。
如下示例:
common包, 定義param_check和ip_check兩個模組
__init__.py : 內容可以為空。__init__.py用於標識當前資料夾是一個包。
param_check:引數校驗模組,例如int、strl型別和空值校驗。
ip_check: ip格式校驗,有效性校驗。
param_exception : common模組所需的異常類。
common/param_check.py:
# coding=utf-8 # 引數校驗(公共模組) from param_exception import ParamException def check_int(i_param): ''' 校驗i_param引數是否為int,不是則丟擲異常 :param i_param: :return: ''' if not isinstance(i_param, int): raise ParamException('引數{}必須為一個int型別'.format(i_param)) def check_str(str_param): ''' 校驗引數是否為str,不是則丟擲異常 :param str_param: :return: ''' if not isinstance(str_param, str): raise ParamException('引數{}必須為一個字串型別'.format(str_param)) if not str_param: raise ParamException('引數不能為空')
備註:作為模組的py檔案,不需要定義main函式。
該模組主要實現是實現int 和 str校驗。
common/ip_check.py:
# coding=utf-8
# ip校驗模組(公共模組)
from param_exception import ParamException
def ipv4_check(ip_str):
'''
ipv4格式校驗,錯誤丟擲異常
:param ip_str: ipv4字串,如192.168.1.1
:return:
'''
sep_list = ip_str.split('.')
if len(sep_list) != 4:
raise ParamException('ip({})錯誤,請傳入ipv4引數(192.168.1.1)'.format(ip_str))
for sep in sep_list:
try:
int_sep = int(sep)
if int_sep < 0 or int_sep > 255:
raise ParamException('ip({})錯誤,請傳入ipv4引數(192.168.1.1)'.format(ip_str))
except ValueError, e:
raise ParamException('ip({})錯誤,請傳入ipv4引數(192.168.1.1)'.format(ip_str))
外面模組呼叫
04_module.py
# coding=utf-8
# 模組
from common import param_check
from common import ip_check
def main():
'''
主函式
:return:
'''
try:
param_check.check_int(10)
param_check.check_int('aaaa')
except Exception as ex:
print(ex)
try:
ip_check.ipv4_check('192.168.10.1')
ip_check.ipv4_check('1111.11.11.1')
except Exception as ex:
print(ex)
if __name__ == '__main__':
main()
結果:
引數aaaa必須為一個int型別
ip(1111.11.11.1)錯誤,請傳入ipv4引數(192.168.1.1)
解釋:
from common import param_check
from common import ip_check
通過from ... import 引入對應的模組,即可呼叫模組中的函式。
參考程式碼 :
https://github.com/minlixia/python(advanced/04_module.py)
2.動態匯入
常用用法中,匯入一個模組通常是from ... import .... 的方法。
但是在另外一種場景中,是通過動態方式匯入的,所需要匯入的模組,儲存在配置檔案中,儲存成字串的形式,例如。
[import]
param_check = common.param_check
通過讀取param_check對應的模組路徑字串,動態匯入後,呼叫對應模組的函式。
示例程式碼:
import importlib
param_check =importlib.import_module('common.param_check')
try:
param_check.check_int(10)
param_check.check_int('aaaa')
except Exception as ex:
print(ex)
結果:
引數aaaa必須為一個int型別
解釋:
通過importlib庫的import_module函式即可將所需要的庫動態匯入進來,引數為庫的位置,效果和from common import param_check 是一樣的。
參考程式碼 :
https://github.com/minlixia/python(advanced/05_dynamic_import.py)
3.json資料
json資料格式,在很多很多地方用的非常非常都,而且用法也非常非常簡單,例如在cgi的傳入傳出引數中,資料庫的欄位中等。
json和python中的dict非常類似,都是鍵值對的形式,並允許多層巢狀。
Pytohn中json資料相關的操作主要使用json庫來操作,用到的主要為json庫的dumps和loads兩個函式,dumps將dict轉換為json字串,loads將json字串轉換為dict變數。
例如:
import json
dict_data = {'key1': 'value1'}
print('dict_data : {}'.format(dict_data))
json_data = json.dumps(dict_data)
print('dict to json : {}'.format(json_data))
dict_data = json.loads(json_data)
print('json to dict : {}'.format(dict_data))
結果:
dict_data : {'key1': 'value1'}
dict to json : {"key1": "value1"}
json to dict : {u'key1': u'value1'}
結果:
dict_data : {'key1': 'value1'}
dict to json : {"key1": "value1"}
json to dict : {u'key1': u'value1'}
參考程式碼 :
https://github.com/minlixia/python(advanced/06_json.py)
python相關的基礎知識就到這裡了,後面的章節主要就是實戰專案了,專案主要為工作中會用到的一些實際專案。