开发 Tips(3)

主要记录最近遇到的一些开发问题,解决方法。

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 的调试工具

    • pdb

    The Python Debugger 是官方调试器,内置在 Python 标准模块中。使用方式:$python -m pdb scriptfile 或者在代码中 pdb.set_trace()

    • ipdb

    基于 ipython 的 pdb,是一个增强版的 pdb。使用方式:$ipdb scriptfile$python –pdb scriptfile

    • PuDB

    全屏的基于控制台的可视化调试器。使用方式:$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