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