我目前正在电子教学平台工作,我正在尝试为学生提交给系统的作业解决方案添加一些PEP8验证,以便给出一些关于好坏的额外反馈他们提出的解决方案是。
我发现使用python pep8
包只是在一大块代码中检查PEP8错误并不是那么简单(在我的情况下,它将是分配的已发布解决方案),没有指定文件系统中特定文件的任何路径。
它确实可行或pep8
库不允许吗?当然,我可以将发布的解决方案保存在tmp文件中并从那里运行验证,但我想避免这个额外的步骤。
有没有人有同样的问题?
答案 0 :(得分: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 :(得分: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检查错误。您的测试代码恰好以空行开头; - )