2015-12-05 2 views
-1

В настоящее время я работаю на платформе eLearning, и я пытаюсь добавить некоторую проверку PEP8 в решения, которые учащиеся подают в систему в чтобы затем дать дополнительную информацию о том, насколько хорошо или плохо решение, которое они предлагают.Python - Как проверить ошибки PEP8 в куске кода без определенного файла

Я обнаружил, что использование пакета python pep8 не так просто проверить ошибки PEP8 только в куске кода (в моем случае это будет опубликованное решение для назначения) без указания пути к определенному файлу в файловой системе.

Возможно ли это, или библиотека pep8 не позволяет? Конечно, я мог бы сохранить опубликованное решение в tmp-файле и запустить проверку там, но я бы хотел избежать этого дополнительного шага.

У кого-то такая же проблема?

+0

Извините за противоречие с вашим словом, но IMO это не дублирование 'Как я могу поместить строку в файл в Python?'. Тот факт, что оба решения используют 'StringIO', не означает, что оба вопроса одинаковы. Проблема здесь была полностью связана с модулем «pep8». Был даже ответ, написанный @Hugh Bothwell, который вообще не связан с StringIO. Извините @ TigerhawkT3, но я думаю, что это не дублированный вопрос (на самом деле я проверил, прежде чем писать). –

ответ

1

я, наконец, нашел способ проверки ошибок PEP8 с использованием файла в памяти

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)) 

ПРИМЕЧАНИЕ: Если ваш с помощью Python 3.x, вам нужно будет использовать вместо io.StringIO.

+1

Когда вы говорите, что «наконец-то» нашли способ, вы, похоже, ответили на свой вопрос в ту же минуту, что и вы его задали !? В любом случае, вы можете проверить онлайн; http://pep8online.com/ –

+0

@marksweb, нет ничего плохого в ответе на собственный вопрос OP. Для получения дополнительной информации вы можете увидеть его http://stackoverflow.com/help/self-answer –

+1

Что такое модуль 'pep8'? Кажется, что это не в стандартной библиотеке. – TigerhawkT3

0

Похоже, это можно сделать без StringIO; просто использовать str.splitlines, например, так:

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)) 

Единственная хитрость заключается в том, что входные строки должны заканчиваться символом новой строки; str.splitlines(keepends=True) делает.

Редактировать: после дополнительной проверки, похоже, проблема проста: первая строка не может быть длиной == 0 или вызывает ошибку при проверке UTF-8. Ваш тестовый код просто начинается с пустой строки ;-)