Python入门到逆袭9(进阶篇3)

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相关的基础知识就到这里了,后面的章节主要就是实战项目了,项目主要为工作中会用到的一些实际项目。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaxiadeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值