Невозможно создать плагин Flake8 для проверки имени функции - PullRequest
0 голосов
/ 23 января 2020

Я пишу простые плагины flake8, чтобы проверить соглашения об именах функций, которые должны начинаться с одного из этих глаголов: «есть, установить, получить, проверить», но это не удалось.

Мой пользовательский плагин 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'

Что было неправильно? Как я могу это исправить? Спасибо

1 Ответ

1 голос
/ 25 января 2020

(не связано, но первое, что я заметил) - у вашего посетителя есть ошибка для вложенных функций:

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}"
...