2015-12-05 1 views
-1

Je travaille actuellement sur une plate-forme eLearning, et j'essaie d'ajouter une validation PEP8 aux solutions d'affectation que les étudiants soumettent au système dans Afin de donner ensuite un retour supplémentaire sur la qualité de la solution proposée.Python - Comment vérifier les erreurs PEP8 dans un morceau de code sans fichier spécifique

J'ai trouvé qu'en utilisant le paquet python pep8 il n'est pas si simple de vérifier les erreurs PEP8 juste dans un morceau de code (dans mon cas, ce serait la solution postée à l'affectation), sans spécifier de chemin vers un fichier spécifique dans le système de fichiers.

Est-il réellement possible ou la bibliothèque pep8 ne le permet pas? Bien sûr, je pourrais enregistrer la solution affichée dans un fichier tmp et lancer la validation à partir de là, mais je voudrais éviter cette étape supplémentaire.

Quelqu'un a-t-il eu le même problème?

+0

Désolé de contredire votre mot, mais OMI ce n'est pas une duplication de 'Comment est-ce que j'emballe une chaîne dans un fichier en Python?'. Le fait que les deux solutions utilisent 'StringIO' ne signifie pas que les deux questions sont identiques. La problématique ici était entièrement liée au module 'pep8'. Il y avait même une réponse écrite par @Hugh Bothwell qui n'implique pas 'StringIO' du tout. Désolé @ TigerhawkT3 mais je pense que ce n'est pas une question dupliquée (en fait j'ai vérifié avant de l'écrire). –

Répondre

1

J'ai finalement trouvé le moyen de valider les erreurs de pep8 à l'aide d'un fichier en mémoire

import pep8 
import StringIO 

code_to_be_checked = """ 
import random 
import string 


class SimplePasswordGenerator(object): 

    list_of_chars = [string.letters, string.digits, string.punctuation] 
    union_of_chars = list(set().union(*list_of_chars)) 

    def __init__(self, available_chars=union_of_chars, length=8): 
     self.available_chars = available_chars 
     self.length = length 

    def __iter__(self): 
     return self 

    def next(self): # use __next__ in Python 3.x 
     password = ''.join([random.choice(self.available_chars) for i in range(self.length)]) 
     return password 
""" 

myfile = StringIO.StringIO(code_to_be_checked) 
fchecker = pep8.Checker(lines=myfile.readlines(), show_source=True) 
errors = fchecker.check_all() 

print("PEP8 error count: {}".format(errors)) 

REMARQUE: Si que vous utilisez 3.x Python, vous devez utiliser io.StringIO à la place.

+1

Quand vous dites que vous avez «finalement» trouvé un moyen, vous semblez avoir répondu à votre propre question dans la même minute que vous l'avez demandé !? Quoi qu'il en soit, vous pouvez vérifier en ligne; http://pep8online.com/ –

+0

@marksweb, Il n'y a rien de mal à répondre à la propre question de OP. Pour plus de détails, vous pouvez le voir http://stackoverflow.com/help/self-answer –

+1

Qu'est-ce que le module 'pep8'? Cela ne semble pas être dans la bibliothèque standard. – TigerhawkT3

0

On dirait que cela peut être fait sans StringIO; il suffit d'utiliser str.splitlines, comme ceci:

import pep8 

code_to_be_checked = """ 
import random 
import string 


class SimplePasswordGenerator(object): 

    list_of_chars = [string.letters, string.digits, string.punctuation] 
    union_of_chars = list(set().union(*list_of_chars)) 

    def __init__(self, available_chars=union_of_chars, length=8): 
     self.available_chars = available_chars 
     self.length = length 

    def __iter__(self): 
     return self 

    def next(self): # use __next__ in Python 3.x 
     password = ''.join([random.choice(self.available_chars) for i in range(self.length)]) 
     return password 
""" 

fchecker = pep8.Checker(lines=code_to_be_checked.splitlines(True), show_source=True) 
errors = fchecker.check_all() 

print("PEP8 error count: {}".format(errors)) 

La seule astuce est que les lignes d'entrée doivent se terminer par des sauts de ligne; str.splitlines(keepends=True) fait cela. Après une vérification supplémentaire, il semble que le problème soit plus simple - la première ligne ne peut pas être de longueur == 0 ou provoque une erreur dans la vérification de l'UTF-8. Votre code de test commence juste à commencer par une ligne vide ;-)