【问题标题】:Python - How to check PEP8 errors in a chunk of code with no specific file [duplicate]Python - 如何在没有特定文件的代码块中检查 PEP8 错误 [重复]
【发布时间】:2023-04-04 04:14:01
【问题描述】:

我目前在一个电子学习平台上工作,我正在尝试在学生提交给系统的作业解决方案中添加一些 PEP8 验证,以便就他们提出的解决方案的优劣提供一些额外的反馈是。

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

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

有人遇到过同样的问题吗?

【问题讨论】:

  • 很抱歉与您的话相矛盾,但 IMO 这不是 How do I wrap a string in a file in Python? 的重复。两种解决方案都使用StringIO 的事实并不意味着这两个问题是相同的。这里的问题与pep8 模块完全相关。 @Hugh Bothwell 甚至写了一个完全不涉及 StringIO 的答案。对不起@TigerhawkT3,但我认为这不是一个重复的问题(实际上我在写之前已经检查过了)。

标签: python pep8


【解决方案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

【讨论】:

  • 当你说你“终于”找到了方法时,你似乎在问问题的那一刻就回答了自己的问题!?无论如何,您可以在线查看; pep8online.com
  • @marksweb,回答 OP 自己的问题没有错。详情可以看stackoverflow.com/help/self-answer
  • pep8 模块是什么?它似乎不在标准库中。
  • @AhsanulHaque 我没有说有问题。只是当我提出问题时,如果我当时有自己的解决方案,我会把它作为我问题的一部分。
  • 坦率地说,使用StringIO 这样做是相当明显的,恕我直言。
【解决方案2】:

看起来不用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) 就是这么做的。

编辑:经过进一步检查,看起来问题更简单了——第一行不能是length==0,否则会导致UTF-8检查出错。您的测试代码恰好以空行开头;-)

【讨论】:

    猜你喜欢
    • 2013-08-28
    • 2022-07-07
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多