无法创建 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}"
我正在编写一个简单的 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}"