Python - 如何检查没有特定文件的代码块中的PEP8错误

时间:2015-12-05 21:22:31

标签: python pep8

我目前正在电子教学平台工作,我正在尝试为学生提交给系统的作业解决方案添加一些PEP8验证,以便给出一些关于好坏的额外反馈他们提出的解决方案是。

我发现使用python pep8包只是在一大块代码中检查PEP8错误并不是那么简单(在我的情况下,它将是分配的已发布解决方案),没有指定文件系统中特定文件的任何路径。

它确实可行或pep8库不允许吗?当然,我可以将发布的解决方案保存在tmp文件中并从那里运行验证,但我想避免这个额外的步骤。

有没有人有同样的问题?

2 个答案:

答案 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检查错误。您的测试代码恰好以空行开头; - )