主要记录最近遇到的一些开发问题,解决方法。
1. Python 的日志模块
Python 的 logging 模块主要由四个部分组成:
Loggers: 可供程序直接调用的接口
Handlers: 将日志记录输出至合适的位置
Filters: 提供更细粒度的日志是否输出判断
Formatters: 定制最终记录打印的布局格式
看下面这个例子,log1.py 文件
1
2
3
4
5
6
7
8
|
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
logger.info('info log')
logger.debug('debug log')
logger.warning('Warning log')
|
直接执行,输出:
1
2
|
2018-10-26 21:08:02,905 - __main__ - INFO - info log
2018-10-26 21:08:02,907 - __main__ - WARNING - Warning log
|
log2 文件
1
|
from log1 import logger
|
直接执行,输出:
1
2
|
2018-10-26 21:11:36,849 - log1 - INFO - info log
2018-10-26 21:11:36,849 - log1 - WARNING - Warning log
|
format 部分参数:
- %(levelno)s:打印日志级别的数值
- %(levelname)s:打印日志级别的名称
- %(pathname)s:打印当前执行程序的路径,其实就是 sys.argv[0]
- %(filename)s:打印当前执行程序名
- %(funcName)s:打印日志的当前函数
- %(lineno)d:打印日志的当前行号
- %(asctime)s:打印日志的时间
- %(thread)d:打印线程 ID
- %(threadName)s:打印线程名称
- %(process)d:打印进程 ID
- %(processName)s:打印线程名称
- %(module)s:打印模块名称
- %(message)s:打印日志信息
2. Python 的调试工具
The Python Debugger 是官方调试器,内置在 Python 标准模块中。使用方式:$python -m pdb scriptfile
或者在代码中 pdb.set_trace()
基于 ipython 的 pdb,是一个增强版的 pdb。使用方式:$ipdb scriptfile
或 $python –pdb scriptfile
全屏的基于控制台的可视化调试器。使用方式:$python -m pudb.run scriptfile
或 $pudb scriptfile
3. Babel 转码器
ES6 提供了许多新特性,但并不是所有的浏览器都能够完美支持,ES5 支持得好很多。Babel 是一个 ES6 转码器,可以将 ES6 代码转为 ES5 代码。这意味着,你可以用 ES6 的语法编写程序,又不用担心现有环境是否支持。
1
2
3
4
5
6
7
|
// 转码前
input.map(item => item + 1);
// 转码后
input.map(function (item) {
return item + 1;
});
|
Babel 的配置文件是 .babelrc ,存放在项目的根目录下。使用该文件设置转码规则和插件,基本格式如下:
1
2
3
4
|
{
"presets": [],
"plugins": []
}
|
4. Badge 生成器
开源项目的文档中,通常会添加各种 Badge 。这些 Badge 有的是写死的,有的是第三方工具动态获取的。推荐 http://shields.io/ 可以非常方便的生成各种 Badge 。
5. 代码统计工具 - Cloc
Cloc 是一款使用 Perl 语言开发的开源代码统计工具,支持多平台、多语言,能够计算指定目标文件或文件夹中的文件数(files)、空白行数(blank)、注释行数(comment)和代码行数(code)。Windows 下,可以先下载安装 msys2,使用 $pacman -S cloc
安装 Cloc,然后统计:
1
2
3
4
5
6
7
8
9
10
11
12
|
cloc .
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
Python 523 10217 13308 61964
JSON 24 22 0 33329
HTML 267 2994 752 29736
XML 3 0 0 21113
...
--------------------------------------------------------------------------------
SUM: 2157 142804 147553 912384
--------------------------------------------------------------------------------
|
6. Django Model 的更新信号处理
通过 created
字段,可以区分 Django Model 的新建和更新操作。
1
2
3
4
5
6
7
8
9
10
11
|
from django.db.models.signals import post_save
@receiver(post_save, sender=User)
def handle_when_user_updated(sender, instance, created, **kwargs):
if not created:
# User object updated
pass
else:
# User object created
pass
|