科探空谷
  • Home
  • zhimind home
  • Categories
  • Tags
  • Archives
  • 留学
    • 学校库
    • 专业库
    • 研究方向与招生
    • 工具
    • GPA计算器
    • 脑洞背单词
    • 脱口而出

用开源项目Pelican学Python

目录

  • 介绍
  • pelican的运行
    • 命令行参数
    • 日志记录
    • 额外模块导入
    • 自省反射
    • 复制
    • 主程序调用
  • 按代码顺序分析
  • 总结
  • Pelican系列链接
  • 链接
目录

介绍¶

通过阅读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

再完成一大堆配置后(没有值得一提的点),程序开始正式运行、解析

主程序调用¶

  1. 调用内容生成器,生成 pelican内容生成器 p = get_generator_classes() p.generate_context()
  2. 调用输出模块 pelican-writer writer = self.get_writer() p.generate_output(writer)

signal 信号部分没看明白

按代码顺序分析¶

在pelican模块的__init__.py文件开始, 第一步main函数

  1. parse_arguments函数: 命令行参数处理模块 argparser
  2. init函数: 日志记录模块 logging
  3. get_instance > read_settings > get_settings_from_file:
    1. 额外模块导入的模块: imp.load_source
    2. get_settings_from_module:
      1. 深度复制(?) copy.deepcopy,copy模块
      2. 自省、反射机制 inspect.getmembers, inspect
  4. 写不下去了~~~

总结¶

编程只要个结果不难,但要正确、稳定、高效就难了,但幸运的是,我们能清楚地判断它 是否正确、稳定、高效,相对英语口语和写作就比较难自评了。

所以多阅读优秀程序的源码, 总结一些架构的思想、 程序实现方式,既以帮助编程,也 能帮助调试。

Pelican系列链接¶

  • 导论
  • 生成模块
  • 输出模块

链接¶

  • <命令行参数解析
  • <日志记录
  • <模块导入
  • <深度复制
  • <反射自省机制
  • 字典dict

  • 什么是自省反射


Published

4月 14, 2017

Last Updated

4月 18, 2017

Category

Python

Tags

  • 代码阅读 3
  • Python 15

Stay in Touch

  • Powered by Pelican. Theme: Elegant by Talha Mansoor