pylint的“公共方法太少”消息意味着什么

2024-05-15 09:48:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在一些代码上运行pylint,并收到错误“公共方法太少(0/2)”。这个信息是什么意思?pylint docs没有帮助:

Used when class has too few public methods, so be sure it's really worth it.


Tags: 方法代码信息docs错误itpublicclass
3条回答

这个错误基本上说类并不意味着存储数据,因为您基本上将类视为字典。类应该至少有几个方法来操作它们所保存的数据。

如果你的班级是这样的:

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

考虑改用字典或namedtuple。虽然如果一个类看起来是最好的选择,使用它。派林特并不总是知道什么是最好的。

请注意,namedtuple是不可变的,以后不能修改在实例化时分配的值。

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

“类不是用来存储数据的”-这是一个错误的语句。字典不是万能的。类的数据成员是有意义的,字典项是可选的。证明:您可以通过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__、只读对象(甚至在Python 2中替换namedtuples)等等。

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并不总是正确的”——接受的答案,以及“使用pylint抑制注释”),但我有自己的建议。

让我再指出一次:有些类意味着只是来存储数据。

现在也可以考虑使用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

上面您有只读属性,这对于值对象来说是可以的(例如,域驱动设计中的属性),但是您也可以提供setter-这样您的类就可以对您拥有的字段负责-例如,进行一些验证等(如果您有setter,您可以在构造函数中使用它们进行赋值,i、 e.self.foo = foo而不是直接的self._foo = foo,但是要小心,setter可能假设已经初始化了其他字段,然后需要在构造函数中进行自定义验证)。

如果您要扩展一个类,那么我的建议是系统地禁用此警告并继续,例如,在芹菜任务中:

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

    ...             

即使你只是扩展一个函数,你肯定需要一个类来实现这个技术函数,而且扩展绝对比攻击第三方类要好!

相关问题 更多 >