Python靜態語法檢查工具

jopen 10年前發布 | 57K 次閱讀 Python 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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!