介绍¶
通过阅读Pelican的源码, 掌握一些Python开发实践方法, 这些方法可能也能用在其他 语言的开发上。
要求读者掌握基本Python语法——严格来说,Python语法很简单,只要看懂一种编程语言 都可以了。
Pelican官网, Pelican是Python语言编写的静态网站生成器 ,主要可以把Markdown,RestructuredText格式的文件转成HTML。
其他部分不作介绍, 安装 pip install pelican,然后就开始吧。
此外, 主要介绍Python里调用逻辑及已经有的好用的、但不知道时会重复创造的轮子(标准 库),而像 os,sys,random,math等不会重写的模块将跳过。
第三方开发的 模块 暂不在介绍范围,除非特别有用
pelican的运行¶
pelican 创建项目这一块先不讨论, 直接从运行开始, 过一遍执行过程、调用过程
MakeFile里的 make html 对应
pelican $(INPUTDIR) -o $(OUTPUTDIR) -s $(BASEDIR)/pelicanconf.py $(PELICANOPTS)
shell\makefile部分略。
命令行参数¶
我们首先看到了 命令行参数, 有像 inputdir 这种, 也有像 -o outputdir 这种带前 置选项参数的。
读者也许知道 linux程序很多是命令行的, 所以经常有这种参数的设置、解析需求, 所 以我们得到的第一个要学习的内容就是 命令行参数设置、解析的最佳实践
有现成的轮子可以使用, Python内置argparse模块就是最佳实践, argparse使用
在 pelican模块__init__.py里main函数的第一行 parse_arguments函数。
日志记录¶
其次,我们需要一个日志记录工具, 不能单靠print打天下, 于是使用内置logging模块 , logging日志记录
第二行init函数,初始化日志记录器
额外模块导入¶
Python用到了很多的模块,内置的、第三方的,但仍然难免有一些作为参数、配置文件的 模块需要导入, 模块导入
get_instance > read_settings > get_settings_from_file
Pelican 的配置文件 pelicanconf.py 是一堆的键key, 值value ,所以我们需要最终得到 一个字典dict,而不是一个模块module,所以我们需要下一步,从模块中读取出一个字典
自省反射¶
Python中的自省反射使用 inspect
接下来,这个配置项 要和默认、命令行配置项进行合并,但我们希望这两个配置项的变量 仍保持独立, 用另一个变量记录合并后的值。
复制¶
手写的话,可能是初始化一个新字典,然后分别遍历两个字典写入新字典里。
我们希望能直接复制一个新字典,然后更新, 但我们知道 Python赋值是增加一个引用, 即浅复制, 我们需要深复制, 所以使用 copy.deepcopy, copy复制模块
之后用另一项值进行更新update,是字典dict的方法, 字典dict
再完成一大堆配置后(没有值得一提的点),程序开始正式运行、解析
主程序调用¶
- 调用内容生成器,生成 pelican内容生成器 p = get_generator_classes() p.generate_context()
- 调用输出模块 pelican-writer writer = self.get_writer() p.generate_output(writer)
signal 信号部分没看明白
按代码顺序分析¶
在pelican模块的__init__.py文件开始, 第一步main函数
- parse_arguments函数: 命令行参数处理模块 argparser
- init函数: 日志记录模块 logging
- get_instance > read_settings > get_settings_from_file:
- 额外模块导入的模块: imp.load_source
- get_settings_from_module:
- 深度复制(?) copy.deepcopy,copy模块
- 自省、反射机制 inspect.getmembers, inspect
- 写不下去了~~~
总结¶
编程只要个结果不难,但要正确、稳定、高效就难了,但幸运的是,我们能清楚地判断它 是否正确、稳定、高效,相对英语口语和写作就比较难自评了。
所以多阅读优秀程序的源码, 总结一些架构的思想、 程序实现方式,既以帮助编程,也 能帮助调试。