无法创建 Flake8 插件来检查函数名称

Unable to Create Flake8 Plugin to Check Function Name

我正在编写一个简单的 flake8 插件来检查它们需要以这些动词之一开头的函数名称约定:"is, set, get, validate",但没有成功。

我的自定义flake8插件是这样的:

setup.py

import setuptools

setuptools.setup(
   name='flake8-var',
   license='MIT',
   version='0.0.1',
   description='Plugin to check coding convention',
   author='QA',
   author_email='qa@gmail.com',
   url='https://example.com',
   py_modules=['flake8_var'],
   entry_points={
       'flake8.extension': [
           'PCK01 = flake8_var:Checker',
       ],
   },
   install_requires=['flake8'],
   classifiers=[
       'Topic :: Software Development :: Quality Assurance',
   ],
)

flake8_var.py

import ast


class Analyzer(ast.NodeVisitor):

    def __init__(self, *args, **kwargs):
        super(ast.NodeVisitor,self).__init__(*args, **kwargs)
        self.stats = []
        self.rule = Rule()

    def visit_FunctionDef(self, node):
        if not self.rule.isValidFunction(node.name):
            verb = ", ".join(str(x) for x in self.rule.verbs)
            msg = "PCK012 Function or Method name must start with one of the ", verb
            self.stats.append((node.lineno, node.col_offset, msg))



class Checker(object):
    options = None
    name = 'flake8_var'
    version = '0.1'

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

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

        for lineno, column, msg in parser.stats:
            yield (lineno, column, msg, Checker)

class Rule(object):
    def __init__(self):
        self.verbs = ['is', 'del', 'set', 'get', 'to']

    def is_camel_case(self, s):
        return s[0].isupper() \
        and s != s.lower() \
        and s != s.upper() \
        and "_" not in s

    def isValidFunction(self, FunName):
        for verb in self.verbs:
            if not FunName.startswith(verb):
                return False
            return True

test.py

def myFun():

    return ''

def setNewValue():

    return ''

在我成功设置插件并通过推荐 $ flake8 test.py 测试插件后,它给了我一个错误:

    error_code, text = text.split(" ", 1)
AttributeError: 'tuple' object has no attribute 'split'

怎么了?我该如何解决?谢谢

(不相关但我注意到的第一件事)——您的访问者有一个嵌套函数错误:

def f():
    def g(): ...

您需要将 self.generic_visit(node) 添加到 visit_FunctionDef

的末尾

至于实际问题,是说错误文本是元组而不是字符串

这是由于这一行:

msg = "PCK012 Function or Method name must start with one of the ", verb

您可能打算使用 + 或某种字符串格式,例如:

msg = f"PCK012 Function or Method name must start with one of the {verb}"