Pylint不断报告R: 73,0:MyLogging: Too many public methods (22/20)以下代码的error():
class MyLogging(logging.Logger):
def foo(self):
pass
def bar(self):
pass
Run Code Online (Sandbox Code Playgroud)
起初我认为这是Pylint中的一个错误,因为MyLogging类只有22行代码,但是我意识到,它包括了基类中的所有公共方法logging.Logger,这增加了20个统计数据.
您知道是否可以从Pylint统计中排除基类公共方法?
PS.我知道我可以更改max-public-methods为更高的数字,或者添加一次异常# pylint: disable=R0904
有方法,但没有一个是好的.
这是不可配置的:您可以在以下位置检查pylint design_analysis.MisdesignChecker中的代码def leave_class:
for method in node.methods():
if not method.name.startswith('_'):
nb_public_methods += 1
Run Code Online (Sandbox Code Playgroud)
上面的代码简单地遍历所有不以"_"开头的方法,并将它们计为公共方法.
因此,我认为有两种方法可以做你想做的事情:
1)fork pylint并修改此方法:
for method in node.methods():
if not method.name.startswith('_') and method.parent == node:
nb_public_methods += 1
Run Code Online (Sandbox Code Playgroud)
method.parent - 定义此函数的类节点; 同样在你的leave_class函数中你有一个参数node- 这是类节点.
比较它们,你可以理解它是否是当前的类.
2)在pylint配置中禁用此规则并创建自己的插件:
MAX_NUMBER_PUBLIC_METHODS = 3
class PublicMethodsChecker(BaseChecker):
__implements__ = (IASTNGChecker,)
name = 'custom-public-methods-checker'
msgs = {
"C1002": ('Too many public methods (%s/%s)',
'Used when class has too many public methods, try to reduce \
this to get a more simple (and so easier to use) class.'),
}
def leave_class(self, node):
"""check number of public methods"""
nb_public_methods = 0
print type(node)
for method in node.methods():
if not method.name.startswith('_') and method.parent == node:
nb_public_methods += 1
if nb_public_methods > MAX_NUMBER_PUBLIC_METHODS:
self.add_message('C1002',
node=node,
args=(nb_public_methods, MAX_NUMBER_PUBLIC_METHODS))
Run Code Online (Sandbox Code Playgroud)
基本上这个实现是来自pylint源代码的design_analysis.MisdesignChecker的略微修改的摘录.
有关插件的更多信息:http://www.logilab.org/blogentry/78354,以及pylint源代码.
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |