无法设置自定义 flake8 插件“FailedToLoadPlugin”

Unable to setup custom flake8 plugin “FailedToLoadPlugin”

我尝试按照教程 Building a custom Flake8 plugin \| Dunderdoc 学习构建 Flake8 插件。

完成本教程后,我得到了如下设置和检查文件:

setup.py

import setuptools

setuptools.setup(
   name='flake8-picky',
   license='MIT',
   version='0.0.1',
   description='Plugin to comply with my picky standards',
   author='Valdir Stumm Junior',
   author_email='stummjr@gmail.com',
   url='http://github.com/stummjr/flake8-picky',
   py_modules=['flake8_picky'],
   entry_points={
       'flake8.extension': [
           'PCK0 = picky_checker:PickyChecker',
       ],
   },
   install_requires=['flake8'],
   classifiers=[
       'Topic :: Software Development :: Quality Assurance',
   ],
)

picky_checker.py

import ast


class ForbiddenFunctionsFinder(ast.NodeVisitor):
    forbidden = ['map', 'filter']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.issues = []

    def visit_Call(self, node):
        if not isinstance(node.func, ast.Name):
            return

        if node.func.id in self.forbidden:
            msg = "PCK01 Please don't use {}()".format(node.func.id)
            self.issues.append((node.lineno, node.col_offset, msg))



class PickyChecker(object):
    options = None
    name = 'picky_checker'
    version = '0.1'

    def __init__(self, tree, filename):
        self.tree = tree
        self.filename = filename

    def run(self):
        parser = ForbiddenFunctionsFinder()
        parser.visit(self.tree)

        for lineno, column, msg in parser.issues:
            yield (lineno, column, msg, PickyChecker)

example.py

data = list(range(100))

x = map(lambda x: 2 * x, data)
print(x)

y = filter(lambda x: x % 2 == 0, data)
print(y)

成功完成插件安装后,我运行命令flake8 example.py并得到以下错误:

flake8.exceptions.FailedToLoadPlugin: Flake8 failed to load plugin "PCK0" due to No module named picky_checker.

什么是错误,我该如何解决?谢谢

您的 setup.py 格式不正确,不包含您选择的包

    py_modules=['flake8_picky'],

应该是

    py_modules['picky_checker'],

否则,setuptools 将不会将您的模块包含在获得 built/installed

的结果包中

顺便说一句,最好的做法是将模块名称与包匹配(当然这不是必需的)——因此我会将模块重命名为 flake8_picky.py 而不是更改 setup.py )