皮林特"Too few public methods"的信息是什么意思?



我在某些代码上运行pylint,并收到"公共方法太少(0/2)"。此消息是什么意思?

Pylint文档没有帮助:

当课程的公共方法太少时使用,因此请确保确实值得。

错误基本上说,当您基本上将课程视为词典时,类并不意味着存储数据。课程至少应该有几种方法来操作其持有的数据。

如果您的班级看起来像这样:

class MyClass(object):
    def __init__(self, foo, bar):
        self.foo = foo
        self.bar = bar

考虑使用字典或namedtuple。尽管如果课程似乎是最好的选择,请使用它。pylint并不总是知道什么是最好的。

请注意,namedtuple是不可变的,稍后无法修改实例化的值。

如果您要延长课程,那么我的建议是系统地禁用此警告并继续前进,例如,在芹菜任务的情况下:

class MyTask(celery.Task):  # pylint: disable=too-few-public-methods                                                                                   
    """base for My Celery tasks with common behaviors; extends celery.Task
    ...             

即使您仅扩展单个功能,也绝对需要一个类来制作此技术功能,并且扩展肯定比在第三方类中攻击更好!

这是皮特盲规则的另一种情况。

"类并不是要存储数据"。 - 这是一个错误的陈述。词典对一切都不好。类的数据成员是有意义的,字典项目是可选的。证明:您可以执行dictionary.get('key', DEFAULT_VALUE)以防止KeyError,但是没有默认的简单__getattr__

推荐使用结构

的方法

我需要更新答案。现在 - 如果您需要struct,则有两个不错的选择:

a)只需使用 attrs

这些是一个库:

https://www.attrs.org/en/stable/

import attr
@attr.s
class MyClass(object):  # Or just MyClass: for Python 3
    foo = attr.ib()
    bar = attr.ib()

您将获得额外的内容:不编写构造函数,默认值,验证,__repr__,仅读取对象(替换namedtuples,甚至在Python 2中)等等。

b)使用dataclasses(PY 3.7 )

遵循HWJP的评论,我也建议dataclasses

https://docs.python.org/3/library/dataclasses.html

这几乎与attrs一样好,并且是标准的图书馆机制(包括"包含的电池"),没有额外的依赖项,除了Python 3.7 。

上一个答案的其余部分

NamedTuple不是很好 - 尤其是在Python 3的typing.NamedTuple之前:https://docs.python.org/3/library/typing.html#typing.namedtuple

  • 您绝对应该查看" NamedTuple"的"类别"。图案。Python 2 -namedtuples由字符串描述创建 - 丑陋,不好,并且在字符串文字中"编程"愚蠢。

我同意当前的两个答案("考虑使用其他东西,但皮特并不总是对的 - 被接受的一个,并且"使用pylint抑制评论",但我有我自己的建议。p>让我再指出一次:有些类是只是存储数据。

现在也可以考虑考虑 - 使用property-IES。

class MyClass(object):
    def __init__(self, foo, bar):
        self._foo = foo
        self._bar = bar
    @property
    def foo(self):
        return self._foo
    @property
    def bar(self):
        return self._bar

上方您拥有只读的属性,这对于值对象(例如,像域驱动设计中的对象)是可以的,但是您也可以提供播放器 - 这样您的班级将能够对您的字段负责您例如 - 例如进行一些验证等。(如果您有启动器,则可以在构造函数中使用它们,即self.foo = foo而不是直接self._foo = foo,但是要小心,固定器可能会假设其他字段已经初始化,然后您才能使用。需要在构造函数中进行自定义验证)。

当您的老板期望单一的责任原则时,很难,但是Pylint说不。因此,在您的班级中添加第二种方法,因此您的班级违反了单一的责任原则。在情人眼中,您打算承担多远的责任原则。

我的修复

我为我的班级添加了额外的方法,所以现在可以做两件事。

def __str__(self):
    return self.__class__.__name__

我只是想知道我现在是否需要将课程分为两个单独的文件,也许还有模块。

问题是解决的,但没有与我的同事们整天争论规格,而不是继续努力,就像它的生与死一样。

相关内容

最新更新