Я разрабатываю плагин flake8, который проверяет соглашение об именах классов: это имя класса модели и обычное имя класса.
Правила таковы:
# 1. Класс модели :
# 2. Нормальный класс :
Но дело в том, что это правило конфликтует друг с другом, что означает, что если один проходит, другой не проходит.
Например, у меня есть два класса, один для имени модели, другой - нормальный класс
test.py
class TBL_CUSTOMER():
ID = db.Column(db.Numeric(25, 9), primary_key=True, autoincrement=True)
PotentialCustomer = db.Column(db.String(12))
FirstNameEn = db.Column(db.String(35))
LastNameEn = db.Column(db.String(35))
FirstNameKh = db.Column(db.String(35))
LastNameKh = db.Column(db.String(35))
class Customer(object):
def __init__(self):
pass
def HelloWorld():
pass
Запустив комментарий $ flake8 test.py
, первый класс TBL_CUSTOMER
пропустит первое правило, но не выполнит второе правило, поэтому наоборот второе класс Customer
.
Поэтому я хочу четко различить guish две проверки. Если это модель класса, проверьте первое правило. В противном случае, проверьте только второе правило.
Вот текущий код для этого:
mktflake8.py
import ast
import mktflake8config as mktf8
class Analyzer(ast.NodeVisitor):
def __init__(self, *args, **kwargs):
super(ast.NodeVisitor,self).__init__(*args, **kwargs)
self.stats = []
self.rule = mktf8.Rule()
def visit_ClassDef(self, node):
# Check the class name for model
if not self.rule.checkTableName(node.name):
msg = self.rule.convention.get('table')
self.stats.append((node.lineno, node.col_offset, msg))
# Check the normal class name
if not self.rule.isCamelCase(node.name):
msg = self.rule.convention.get('class')
self.stats.append((node.lineno, node.col_offset, msg))
self.generic_visit(node)
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)
mktflake8config .py
class Rule(object):
def __init__(self):
self.convention = {
'table' : "PCK015 Table Name should start with MKT_, and all UPPER Case Seperated by '_'.",
‘class’ : “PCK016 Class Name should be in camel case.”
}
def isCamelCase(self, s):
return s[0].isupper() \
and s != s.lower() \
and s != s.upper() \
and "_" not in s
def checkTableName(self, Name):
if 'TBL_' in Name.upper() and Name.startswith('TBL_'):
NameList = Name.split('_')
for Name in NameList:
if not Name.isupper():
return False
return True
Как уже упоминалось, как я могу сделать для полного разделения этого правила? Спасибо