2.3.1 避免bugs
2.3.1.1 避免麻烦的最佳代码实践
Brian Kernighan
“每个人都知道除错比从零开始写一个程序难两倍。因此,如果当你写程序时足够聪明,为什么你不对它进行除错呢?”
- 我都会写出有错误的代码。接收这些代码。处理这些代码。
- 写代码时记得测试和除错。
- 保持简单和直接(KISS)。
- 能起作用的最简单的事是什么?
- 不要重复自身(DRY)。
- 每一个知识碎片都必须在系统中有一个清晰、权威的表征
- 变量、算法等等
- 试着限制代码的依赖。(松耦合)
- 给变量、函数和模块有意义的名字(而不是数学名字)
2.3.1.2 pyflakes:快速静态分析
在Python中有一些静态分析;举几个例子:
这里我们关注pyflakes
,它是最简单的工具。
- 快速、简单
- 识别语法错误、没有imports、名字打印打错。
另一个好的推荐是flake8
工具,是pyflakes和pep8。因此,除了pyflakes捕捉错误类型外,flake8也可以察觉对PEP8风格指南建议的违背。
强烈推荐在你的编辑器或IDE整合pyflakes (或 flake8),确实可以产出生产力的收益。
2.3.1.2.1 在当前编辑文件上运行pyflakes
你可以在当前缓存器中绑定一个键来运行pyflakes。
- 在kate中
- 菜单:设定 -> 配置 kate
- 在插件中启用“外部”
- 在外部工具,添加pyflakes:
In [ ]:
kdialog --title "pyflakes %filename" --msgbox "$(pyflakes %filename)"
- 在TextMate中
- 菜单: TextMate -> 偏好 -> 高级 -> Shell变量,添加shell变量:
In [ ]:
TM_PYCHECKER=/Library/Frameworks/Python.framework/Versions/Current/bin/pyflakes
- 然后 Ctrl-Shift-V 被绑定到pyflakes报告
- 在vim中
- 在你的vimrc中 (将F5绑定到pyflakes):
In [ ]:
autocmd FileType python let &mp = 'echo "*** running % ***" ; pyflakes %'
autocmd FileType tex,mp,rst,python imap <Esc>[15~ <C-O>:make!^M
autocmd FileType tex,mp,rst,python map <Esc>[15~ :make!^M
autocmd FileType tex,mp,rst,python set autowrite
- 在emacs中
- 在你的emacs中 (将F5绑定到pyflakes):
In [ ]:
(defun pyflakes-thisfile () (interactive)
(compile (format "pyflakes %s" (buffer-file-name)))
)
(define-minor-mode pyflakes-mode
"Toggle pyflakes mode.
With no argument, this command toggles the mode.
Non-null prefix argument turns on the mode.
Null prefix argument turns off the mode."
;; The initial value.
nil
;; The indicator for the mode line.
" Pyflakes"
;; The minor mode bindings.
'( ([f5] . pyflakes-thisfile) )
)
(add-hook 'python-mode-hook (lambda () (pyflakes-mode t)))
2.3.1.2.2 随着打字进行的拼写检查器整合
在vim中
- 使用pyflakes.vim插件:
- 从http://www.vim.org/scripts/script.php?script_id=2441 下载zip文件
- 将文件提取到~/.vim/ftplugin/python
- 确保你的vimrc的filetype插件的缩进是开启的
- 或者: 使用syntastic插件。这个插件也可以设置为使用flake8,处理实时检查许多其他语言。
- 使用pyflakes.vim插件:
在emacs中
- 使用flymake模式以及pyflakes, 文档在http://www.plope.com/Members/chrism/flymake-mode : 在你的.emacs文件中添加下来代码:
In [ ]:
(when (load "flymake" t)
(defun flymake-pyflakes-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "pyflakes" (list local-file))))
(add-to-list 'flymake-allowed-file-name-masks
'("\\.py\\'" flymake-pyflakes-init)))
(add-hook 'find-file-hook 'flymake-find-file-hook)