1. 程式人生 > 其它 >Python入門到逆襲9(進階篇3)

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相關的基礎知識就到這裡了,後面的章節主要就是實戰專案了,專案主要為工作中會用到的一些實際專案。