Cet article fournit une introduction complète à l'outil d'analyse de code Python Pylint à travers une introduction théorique détaillée et des exemples faciles à comprendre. Je pense que les lecteurs pourront facilement appliquer Pylint à leurs propres projets de développement après avoir lu ceci
Qu'est-ce que Pylint
Pylint est un outil d'analyse de code Python qui analyse Python Erreurs dans le code, recherche de code non conforme aux normes de style de codage (le style de codage utilisé par Pylint par défaut est PEP 8, voir Ressources pour des informations spécifiques) et de code potentiellement problématique. La dernière version de Pylint est actuellement pylint-0.18.1.
Pylint est un outil Python En plus des fonctions des outils d'analyse de code ordinaires, il fournit plus de fonctions : comme vérifier la longueur d'une ligne de code, si les noms de variables sont conformes. normes de dénomination, si une interface déclarée est réellement implémentée, etc.
Un grand avantage de Pylint est qu'il est hautement configurable, hautement personnalisable et qu'il est facile d'écrire de petits plug-ins pour ajouter des fonctionnalités.
Si vous exécutez Pylint deux fois, il affichera simultanément les résultats des exécutions en cours et de la dernière, afin que vous puissiez voir si la qualité du code a été améliorée.
Pylint est actuellement également intégré au plug-in pydev d'Eclipse.
Introduction détaillée de Pylint
Installation de Pylint
Pylint peut être utilisé pour toutes les versions de Python supérieures ou égales à 2.2 et est compatible. Les packages logilab-astng (version >= 0.14) et logilab-common (version >= 0.13) sont requis (voir Ressources pour des informations spécifiques). Si la version de Python est inférieure à 2.3, elle nécessite également le package optik (). cet article Les exemples suivants ne prendront pas en compte ce cas).
L'adresse de téléchargement de tous les packages utilisés par Pylint
Le dernier téléchargement de package de logilab-astng : http://www.logilab.org/856/
Téléchargement du dernier package de Logilab-common : http://www.logilab.org/848/
Téléchargement du package d'optik : http://optik.sourceforge.net/
Télécharger le dernier package de Pylint : http://www.logilab.org/project/pylint
Installation de Pylint sous Linux
1 Sous Linux, installez d'abord Python. package (au-dessus de la version 2.2) et ajoutez le chemin du fichier exécutable Python dans la variable d'environnement $PATH.
2. Téléchargez les packages de Pylint, logilab-astng (version >= 0.14) et logilab-common (version >= 0.13), et utilisez tar zxvf *.tar.gz pour décompresser ces packages.
3. Entrez les dossiers dans lesquels logilab-astng, logilab-common et Pylint ont été extraits dans l'ordre, et exécutez la commande Python setup.py install pour installer.
4. Une fois l'installation terminée, vous pouvez appeler Pylint via pylint [options] module_or_package.
Installation de Pylint sous Windows
1. Installez le package Python (au-dessus de la version 2.2), cliquez avec le bouton droit sur l'icône Poste de travail sur le bureau et sélectionnez Propriétés, Avancé, variables d'environnement, ajoutez le chemin d'installation de Python dans $PATH, tel que C:Python26.
2. Utilisez l'outil de décompression pour décompresser tous les packages.
3. Ouvrez la fenêtre de ligne de commande, utilisez cd pour entrer dans l'ordre les dossiers décompressés de logilab-astng, logilab-common et Pylint, et exécutez la commande python setup.py install pour installer.
4. Une fois l'installation terminée, un dossier Scripts apparaîtra dans le chemin d'installation de Python, qui contient certains scripts bat, tels que pylint.bat, etc.
5. Afin d'éviter de saisir le chemin complet lors de l'appel de pylint.bat, créez un fichier de redirection de pylint.bat dans le répertoire d'installation de Python. Il s'agit d'un fichier texte brut pylint.bat, qui contient pylint.bat Actual. chemin, tel que : C:\Python26Scriptspylint.bat.
6. Une fois l'installation terminée, vous pouvez appeler Pylint via pylint [options] module_or_package.
Appel de Pylint
Liste 1. Commande d'appel de Pylint
pylint [options] module_or_package
Utilisez Pylint pour vérifier le code d'un module module.py :
1 Entrez le dossier où se trouve le module et exécutez pylint [options] module.py
.
Cette méthode d'appel fonctionnera toujours, car le répertoire de travail actuel sera automatiquement ajouté au chemin Python.
2. Sans entrer le dossier où se trouve le module, exécutez pylint [options] directory/module.py<code>pylint [options] directory/module.py<br>
Cette méthode d'appel est utilisée lorsque les conditions suivantes sont remplies Cela fonctionne lorsque : le répertoire est un package Python (par exemple, contient un fichier __init__.py) ou le répertoire est ajouté au chemin Python.
Utilisez Pylint pour vérifier le code d'un package package :
1 Entrez le dossier où se trouve le package et exécutez pylint [options] pakage
. .
Cette méthode d'appel fonctionnera toujours, car le répertoire de travail actuel sera automatiquement ajouté au chemin Python.
2. Exécutez pylint [options] directory/ pakage
sans entrer dans le dossier où se trouve le package.
Dans ce cas, cela peut fonctionner lorsque les conditions suivantes sont remplies : le répertoire est ajouté au chemin Python. Par exemple, sous Linux, exportez le répertoire PYTHONPATH=$PYTHONPATH:.
De plus, pour les machines sur lesquelles le package tkinter est installé, vous pouvez utiliser la commande pylint-gui pour ouvrir une interface graphique simple, entrez ici le nom du module ou du package (les règles sont les mêmes comme ligne de commande), puis cliquez sur Exécuter. La sortie de Pylint s'affiche dans l'interface graphique.
Paramètres de ligne de commande courants de Pylint
-h, --help
Afficher toutes les informations d'aide.
--generate-rcfile
Vous pouvez utiliser pylint --generate-rcfile pour générer un exemple de fichier de configuration. Vous pouvez utiliser la redirection pour enregistrer ce fichier de configuration pour une utilisation ultérieure. Vous pouvez également ajouter d'autres options devant afin que les valeurs de ces options soient incluses dans le fichier de configuration généré. Par exemple : pylint --persistent=n --generate-rcfile > pylint.conf, vous pouvez voir que persistent=no n'est plus sa valeur par défaut de yes.
--rcfile=
Spécifiez un fichier de configuration. Mettez la configuration que vous utilisez dans le fichier de configuration, ce qui non seulement standardise votre propre code, mais facilite également le partage de ces spécifications avec d'autres.
-i
Inclure l'identifiant du message dans la sortie, puis transmettre pylint --help - msg=
-r
La valeur par défaut est y, ce qui signifie qu'en plus de la partie analyse du code source, La sortie de Pylint contient également une section de reporting.
--files-output=
Sortir le message de chaque module/package dans un fichier nommé pylint_module/package.[txt|html] Dans le fichier, s'il existe un rapport, il sera généré dans un fichier nommé pylint_global.[txt|html]. La valeur par défaut est la sortie à l'écran et non dans un fichier.
-f
Définissez le format de sortie. Les formats pouvant être sélectionnés sont texte, analysable, colorisé, msvs (visual studio) et html. Le format de sortie par défaut est le texte.
--disable-msg=
Désactivez les messages avec les identifiants spécifiés Par exemple, si la sortie contient le message d'avertissement W0402, si vous le faites. je ne veux pas Il apparaît dans la sortie et peut être vu en utilisant le format --disable-msg= W0402 (texte brut), vous pouvez utiliser -f
Pour chaque module Python, le résultat Pylint affiche d'abord quelques caractères "*", suivis du nom du module, puis A série de messages, le format du message est le suivant :
MESSAGE_TYPE : LINE_NUM :[OBJECT :] MESSAGEMESSAGE_TYPE a les types suivants :
(W) Attention. Quelques questions spécifiques à Python.(C) Convention. Viole les normes de style de codage
(R) Refactor. Code très mal écrit.
(E) Erreur. Très probablement un bug dans le code. (F) Erreur fatale. Une erreur qui empêche Pylint de continuer à fonctionner.
Listing 2. Sortie du module utils dans PylintR:183:MessagesHandlerMixIn._cat_ids : Méthode pourrait être une fonctionC:183:MessagesHandlerMixIn._cat_ids : Docstring manquant
**************** Module utils
C : 88 :Message : Docstring manquant
R : 88 : Message : Trop peu de méthodes publiques (0/2)
R:282:MessagesHandlerMixIn.list_messages : Trop de branches (14/12)
Section Rapport :
À la fin d'analyse du code source Plus tard, il y aura une série de rapports, chaque rapport se concentrant sur certains aspects du projet, tels que le nombre de messages dans chaque catégorie, les dépendances des modules, etc. Plus précisément, le rapport comprendra les aspects suivants :
Le nombre de modules vérifiés.
Pour chaque module, le pourcentage d'erreurs et d'avertissements. Par exemple, il y a deux modules A et B. Si un total de 4 erreurs sont détectées, 1 erreur est en A et 3 erreurs sont en B, alors le pourcentage d'erreur de A est de 25 % et le pourcentage d'erreur de B est de 75 %. .
Nombre total d'erreurs, d'avertissements.
Ce qui suit est un morceau de code Python qui lit certaines valeurs d'un xml et les affiche dw.py, le code est le suivant :
Listing 4. Identity.xml Le contenu de
import string #!/usr/bin/env python import xml.dom.minidom xmlDom=xml.dom.minidom.parse("identity.xml") organizations = xmlDom.getElementsByTagName('DW') for org in organizations: products = org.getElementsByTagName('linux') for product in products: print 'ID: ' + product.getAttribute('id') print 'Name: ' + product.getAttribute('name') print 'Word Count: ' + product.getAttribute('count')
<IBM> <DW> <linux id="100" name="python" count="3000" /> </DW> </IBM>
************* Module dw
C:1:Missing docstring
C:5:Operator not preceded by a space xmlDom=xml.dom.minidom.parse("identity.xml") ^
C:5:Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C:6:Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
Report 部分省略
输出中第一部分是源代码分析,第二部分是报告。输出结果中有这么多信息,从哪里开始分析呢?首先使用如下的步骤来分析代码:
1. 因为输出结果太长,所以可以先不让它输出报告部分,先根据源代码分析部分来找出代码中的问题。使用选项 "--reports=n"。
2. 使用选项 "--include-ids=y"。可以获取到源代码分析部分每条信息的 ID。
清单 6. 使用 pylint --reports=n --include-ids=y dw.py 的结果
************* Module dw
C0111: 1: Missing docstring
C0322: 5: Operator not preceded by a space xmlDom=xml.dom.minidom.parse("identity.xml") ^
C0103: 5: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C0103: 6: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
每个信息前面都会加上一个 id, 如果不理解这个信息的意思,可以通过 pylint --help-msg=id来查看。
清单 7. 使用 pylint --help-msg= C0111 的结果
C0111: *Missing docstring*
Used when a module, function, class or method has no docstring. Some special
methods like __init__ doesn't necessary require a docstring.
This message belongs to the basic checker.
3. 开始分析每个源代码中的问题。从上面知道,第一个问题的原因是缺少 docstring,在代码中增加 docstring, 修改后的代码如下:
清单 8. 增加 docstring 修改后的源码
#!/usr/bin/env python """This script parse the content of a xml file""" import xml.dom.minidom xmlDom=xml.dom.minidom.parse("identity.xml") organizations = xmlDom.getElementsByTagName('DW') for org in organizations: products = org.getElementsByTagName('linux') for product in products: print 'ID: ' + product.getAttribute('id') print 'Name: ' + product.getAttribute('name') print 'Word Count: ' + product.getAttribute('count')
重新运行 pylint --reports=n --include-ids=y dw.py,结果为:
清单 9. 运行结果
************* Module dw
C0322: 7: Operator not preceded by a space
xmlDom=xml.dom.minidom.parse("identity.xml")
^
C0103: 7: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C0103: 8: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
可以看到源代码中的第一个问题已被解决。
4. 关于第二个 C0322 的问题,这里的分析结果说明得比较清楚,是代码第七行中的等号运算符两边没有空格。我们在这里加上空格,重新运行 pylint --reports=n --include-ids=y dw.py,结果为:
清单 10. 运行结果
************* Module dw
C0103: 7: Invalid name "xmlDom" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C0103: 8: Invalid name "organizations" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
5. 可以看到现在问题只剩下 C0103 了。这里的意思是变量命名规则应该符合后面正则表达式的规定。Pylint 定义了一系列针对变量,函数,类等的名字的命名规则。实际中我们不一定要使用这样的命名规则,我们可以定义使用正则表达式定义自己的命名规则,比如使用选项 --const-rgx='[a-z_][a-z0-9_]{2,30}$',我们将变量 xmlDom改为 xmldom, 代码如下:
清单 11. 将变量 xmlDom 改为 xmldom 后的源码
#!/usr/bin/env python """This script parse the content of a xml file""" import xml.dom.minidom xmldom = xml.dom.minidom.parse("identity.xml") organizations = xmldom.getElementsByTagName('DW') for org in organizations: products = org.getElementsByTagName('linux') for product in products: print 'ID: ' + product.getAttribute('id') print 'Name: ' + product.getAttribute('name') print 'Word Count: ' + product.getAttribute('count')
运行 pylint --reports=n --include-ids=y --const-rgx='[a-z_][a-z0-9_]{2,30}$' dw.py,结果中就没有任何问题了。
6. 如果希望一个组里的人都使用这些统一的规则,来规范一个部门的代码风格。比如说大家都使用 --const-rgx='[a-z_][a-z0-9_]{2,30}$'作为命名规则,那么一个比较便捷的方法是使用配置文件。
使用 pylint --generate-rcfile > pylint.conf来生成一个示例配置文件,然后编辑其中的 --const-rgx选项。或者也可以直接 pylint --const-rgx='[a-z_][a-z0-9_]{2,30}$' --generate-rcfile > pylint.conf,这样生成的配置文件中 --const-rgx选项直接就是 '[a-z_][a-z0-9_]{2,30}$'了。
以后运行 Pylint 的时候指定配置文件:pylint --rcfile=pylint.conf dw.py
这样 Pylint 就会按照配置文件 pylint.conf中的选项来指定参数。在一个部门中,大家可以共同使用同一个配置文件,这样就可以保持一致的代码风格。
7. 如果把 report 部分加上,即不使用 --reports=n,可以看到报告部分的内容。
结束语
Cet article fournit une introduction complète à l'outil d'analyse de code Python Pylint à travers une introduction théorique détaillée et des exemples faciles à comprendre. Je pense que les lecteurs pourront facilement appliquer Pylint à leurs propres projets de développement après avoir lu ceci.
Sujets connexes
Site officiel de Pylint.
Téléchargez le dernier package de logilab-astng.
Téléchargez le dernier package de logilab-common.
Téléchargement du package Optik.
Téléchargement du dernier package de Pylint.
Voir la norme de style de code Python PEP 8 -- Guide de style pour le téléchargement du code Python.
Pour plus d'informations sur Python, veuillez vous référer à la rubrique Python sur DeveloperWorks.
Recommandations associées :
L'outil de vérification de code Python pylint rend votre python plus standardisé
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!