Python靜態語法檢查工具
Python是一門動態語言。在給python傳參數的時候并沒 有嚴格的類型限制。寫python程序的時候,發現錯誤經常只能在執行的時候發現。有一些 錯誤由于隱藏的比較深,只有特定邏輯才會觸發,往往導致需要花很多時間才能將語法錯誤慢慢排查出來。其實有一些錯誤是很明顯的,假如能在寫程序的時候發現 這些錯誤,就能提高工作效率。
注:習慣了C/C++等編譯語言,使用像Python這種動態語言,總有點不放心,特別是搭建比較大的系統的時候。Python靜態語法檢查工具就出現了。
Pyflakes(錯誤檢查利器)
Pyflakes的下載地址:https://pypi.python.org/pypi/pyflakes
一個用于檢查Python源文件錯誤的簡單程序。
Pyflakes分析程序并且檢查各種錯誤。它通過解析源文件實現,無需導入它,因此在模塊中使用是安全的,沒有任何的副作用。它也相當的快。
安裝
快速安裝方法:pip installpyflakes
你可以有兩種方式使用Pyflakes:
命令行使用
命令行用法:
pyflakes *.py
VIM配置
第二種方式:VIM編輯器的配置,首先Vim必須支持Python,VIM是否支持Python使用下面的方式檢查。
vim
#進入vim編輯器界面之后,在命令行模式下輸入如下命令
:version
VIM - Vi IMproved 7.3 (2010Aug 15, compiled Oct 27 2010 17:51:38)
MS-Windows 32 位控制臺版本
包含補丁: 1-46
編譯者 Bram@KIBAALE
大型版本 無圖形界面。 可使用(+)與不可使用(-)的功能:
+arabic +autocmd-balloon_eval -browse ++builtin_terms +byte_offset +cindent
+clientserver +clipboard+cmdline_compl +cmdline_hist +cmdline_info +comments
+conceal +cryptv +cscope+cursorbind +cursorshape +dialog_con +diff +digraphs -dn
-ebcdic +emacs_tags +eval+ex_extra +extra_search +farsi +file_in_path
+find_in_path +float+folding -footer +gettext/dyn -hangul_input +iconv/dyn
+insert_expand +jumplist+keymap +langmap +libcall +linebreak +lispindent +listcm
+localmap -lua +menu +mksession +modify_fname+mouse -mouseshape +multi_byte
+multi_lang -mzscheme-netbeans_intg -osfiletype +path_extra -perl +persistent_un
-postscript +printer -profile -python -python3+quickfix +reltime +rightleft -ru
+scrollbind +signs +smartindent -sniff+startuptime +statusline -sun_workshop
+syntax +tag_binary+tag_old_static -tag_any_white -tcl -tgetent -termresponse
+textobjects +title -toolbar+user_commands +vertsplit +virtualedit +visual
+visualextra +viminfo+vreplace +wildignore +wildmenu +windows +writebackup
-xfontset -xim -xterm_save-xpm_w32
其中,+號代表支持,-號表示不支持。因此上面的vim不支持python,那么你需要升級你們的vim啦!下面我們對vim進行配置,使其支持pyflakes。
首先,下載pyflakes.vim,將其解壓到vim的配置文件夾,例如:直接拷貝到/etc/vim/文件夾下面。
然后,修改vim的配置,打開vimrc,配置如下選項:
ifhas("autocmd")
filetype plugin indent on
endif
flake8(代碼規范利器)
概述
flake8是下面三個工具的封裝:
1)PyFlakes
2)Pep8
3)NedBatchelder’s McCabe script
Flake8的下載地址:https://pypi.python.org/pypi/flake8,優點是可擴展。
Flake8通過啟動單獨的flake8腳本運行所有工具,它在一個Per文件中顯示告警,合并到輸出中。
也增加一些特征:
1)包含這行文件將被忽略:#flake8: noqa
2)結尾包含#noqa注釋的行將不發布告警
3)GIT和Mercurial鉤子
4)McCabe復雜度檢查器
5)可以通過flake8.extension入口點擴展
安裝
下載源碼后解壓縮進行安裝:pythonsetup.py install
快速安裝:pipinstall flake8
使用
為了運行flake8只需在任意目錄或Python模塊上調用它。
$ flake8 coolproject
coolproject/mod.py:97:1: F401 'shutil'imported but unused
coolproject/mod.py:625:17: E225 missingwhitespace around operato
coolproject/mod.py:729:1: F811 redefinitionof function 'readlines' from line 723
coolproject/mod.py:1028:1: F841 localvariable 'errors' is assigned to but never used
PyFlakes和Pep8(和可選的插件)的輸出將合并起來一起返回。
Flake8提供一個擴展選項:--max-complexity,如果函數的McCabe復雜度比給定的值更高將發出一個告警。缺省它是不激活的。
$ flake8 --max-complexity 12 coolproject
coolproject/mod.py:97:1: F401 'shutil'imported but unused
coolproject/mod.py:625:17: E225 missingwhitespace around operator
coolproject/mod.py:729:1: F811 redefinitionof unused 'readlines' from line 723
coolproject/mod.py:939:1: C901'Checker.check_all' is too complex (12)
coolproject/mod.py:1028:1: F841 localvariable 'errors' is assigned to but never used
coolproject/mod.py:1204:1: C901 'selftest'is too complex (14)
該特征對于檢查非常復雜的代碼相當有用。根據McCabe,低于10的任何代碼都太復雜了。
VIM配置
如果希望在Vim中使用flake8,使用vundle進行安裝。
" Flake8 plugin for Vim.
Bundle 'nvie/vim-flake8'
" compiler plugin for python stylechecking tool.
Bundle 'vim-scripts/pylint.vim'
autocmd FileType python compiler pylint
vundle的官方網址:https://github.com/gmarik/vundle
簡單可用的vimrc,下載方法如下:
git clone https://github.com/icocoa/icocoa-vimrc.git--recursive vimrc // icocoa is my another account in GitHub
Pychecker
官方網址:http://pychecker.sourceforge.net/
http://sourceforge.net/projects/pychecker/
https://pypi.python.org/pypi/PyChecker
概述
PyChecker是Python代碼的靜態分析工具,它能夠幫助查找Python代碼的bug,而且能夠對代碼的復雜度和格式等提出警告。
PyChecker可以工作在多種方式之下。首先,PyChecker會導入所檢查文件中包含的模塊,檢查導入是否正確,同時檢查文件中的函數、類和方法等。
PyChecker可以檢查出來的問題有如下幾種:
1)全局量沒有找到,比如沒有導入模塊
2)傳遞給函數、方法、構造器的參數數目錯誤
3)傳遞給內建函數和方法的參數數目錯誤
4)字符串格式化信息不匹配
5)使用不存在的類方法和屬性
6)覆蓋函數時改變了簽名
7)在同一作用域中重定義了函數、類、方法
8)使用未初始化的變量
9)方法的第一個參數不是self
10)未使用的全局量和本地量(模塊或變量)
11)未使用的函數/方法的參數(不包括self)
12)模塊、類、函數和方法中沒有docstring
安裝
從官網下載最新版本的PyChecker之后,解壓安裝即可:
python setup.pyinstall
基本使用
pycheckersetup.py
使用--only參數可以只檢查自身的語法問題。
pychecker --onlysetup.py
參數和選項說明:pychecker[options] file1.py file2.py ...
--only 只給出命令行的文件的警告,默認為no
-#,--limit 顯示的最大警告數,默認為10
--no-shadowbuiltin 檢查是否有變量覆蓋了內建變量,默認為off
-q,--stdlib 忽略標準庫的文件的警告,默認為off
-T,--argsused 未使用的方法/函數的關鍵字,默認為on
配置
修改默認配置和行為:.pycheckrc文件,該文件放置在$HOME目錄下,--rcfile選項可以生成一份默認的配置文件。
要禁止一些模塊/函數/類/方法的警告信息,可以在.pycheckrc文件中定義一個禁止字典,鍵類似:“module”,“module.function”,“module.class”等。
或者直接在代碼中定義:
__pychecker__ ='no-namedargs maxreturns=0 unsednames=foo,bar'
其中__pychecker__格式的值和在禁止字典中的值是一樣的。
在代碼文件中導入PyChecker模塊及使用:
importpychecker.checker
這將會檢查所有在PyChecker之后導入的模塊,之前的不檢查。
如果不能傳遞命令行參數,可以使用:
os.environ['PYCHECKER']= 'command line options here'
等價于在shell環境中設置PYCHECKER:
PYCHECKER='no-namedargsmaxreturns=0' /path/to/your/program
要關閉警告,可以在導入PyChecker之前,加上:
os.environ['PYCHECKER_DISABLED']= 1
等價于在shell環境中設置PYCHECKER_DISABLED:
PYCHECKER_DISABLED=1/path/to/your/program
Pylint(推薦)
PyLint的下載地址:https://pypi.python.org/pypi/pylint
PyLint的官網:http://www.pylint.org/
概述
PyLint是Python源代碼分析器,它查找編程錯誤,幫助執行一個代碼標準和嗅探一些代碼味道。
缺省情況下,PyLint啟用許多規則。它具有高度可配置性,從代碼內部處理程序控制它。另外,編寫插件添加到自己的檢查中是可能的。
注意:相比于PyChecker,Pylint是一個高階的Python代碼分析工具,它分析Python代碼中的錯誤,查找不符合代碼風格標準 (Pylint 默認使用的代碼風格是 PEP 8)和有潛在問題的代碼。目前 Pylint 的最新版本是 pylint-1.2.1。可以檢查一行代碼的長度、變量名是否符合規范等。運行兩次可以看出代碼是否改進,分數是否有所提高,10分滿分。
Pylint是一個 Python 代碼分析工具,它分析 Python 代碼中的錯誤,查找不符合代碼風格標準(Pylint 默認使用的代碼風格是 PEP 8,具體信息,請參閱參考資料)和有潛在問題的代碼。
1)Pylint 是一個 Python 工具,除了平常代碼分析工具的作用之外,它提供了更多的功能:如檢查一行代碼的長度,變量名是否符合命名標準,一個聲明過的接口是否被真正實現等等。
2)Pylint 的一個很大的好處是它的高可配置性,高可定制性,并且可以很容易寫小插件來添加功能。
3)如果運行兩次Pylint,它會同時顯示出當前和上次的運行結果,從而可以看出代碼質量是否得到了改進。
4)目前在 eclipse 的 pydev 插件中也集成了Pylint。
Pylint要求astroid(越新越好)和logilab-common(版本>= 0.53)軟件包。
https://bitbucket.org/logilab/astroid
http://www.logilab.org/projects/common
安裝
從源碼發行版安裝,解壓Tar包并且運行:
python setup.py install
快速安裝方法:pipinstall pylint
你必須使用類似的方法安裝依賴。對于Debian和RPM安裝包,根據你Linux發行版中使用你的常用工具。
PyDev中對Python的語法檢查使用了PyLint,配置它是需要注意下面幾點:
1)首先要安裝logilab-asting和logilab-common。
2)然后要讓這兩個包正常工作,要對logilab-common做些動作:
proc.py line(115)
fromsignal import * #signal, SIGXCPU, SIGKILL, SIGUSR2, SIGUSR1
fromos import * #killpg, getpid, setpgrp
fromthreading import Timer, currentThread, Thread, Event
fromtime import time
#from resource import getrlimit, setrlimit,RLIMIT_CPU, RLIMIT_AS
錯誤提示說明
(C) 慣例。違反了編碼風格標準
(R) 重構。寫得非常糟糕的代碼。
(W) 警告。某些 Python 特定的問題。
(E) 錯誤。很可能是代碼中的錯誤。
(F) 致命錯誤。阻止 Pylint 進一步運行的錯誤。
運行
從命令行調用Pylint,使用方法如下:
pylint [options] module_or_package
你應該給PyLint傳遞一個Python包或模塊的名稱。Pylint將導入該包或模塊,因此你應該注意你的PYTHONPATH,因為它是一個常見錯誤分析模塊的安裝版本,而不是開發版本。
也可以分析Python文件,但是有一些限制。記住Pylint將嘗試轉換文件名為模塊名,只有成功才能處理文件。
來自:http://blog.csdn.net/fan_hai_ping/article/details/41733817