什么pylint的的“太少的公共方法”的消息意味着(What does pylint's “

2019-08-04 15:55发布

我对一些代码运行pylint的,并收到错误“太少公共方法(0/2)”。 这是什么意思的消息? 该pylint的文档也没有什么帮助:

使用时类有太少的公共方法,所以可以肯定的,它是值得的。

Answer 1:

错误基本上是说类并不意味着只是存储数据,因为你基本上是治疗类作为字典。 类至少应该有一些方法来对他们持有的数据进行操作。

如果您的类看起来是这样的:

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

考虑使用一本词典或是namedtuple代替。 但如果一个类似乎是最好的选择,使用它。 pylint的并不总是知道什么是最好的。

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



Answer 2:

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

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

    ...             

即使你只延伸的单一功能,你肯定需要一个类,使这项技术的功能和扩展是绝对比黑客对第三方类的更好!



Answer 3:

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

“类并不意味着存储数据” - 这是一个伪命题。 词典是不好的一切。 一类的数据成员是有意义的事,一本字典项是什么可选的。 证明:你可以做dictionary.get('key', DEFAULT_VALUE)以防止KeyError ,但没有简单__getattr__默认。

编辑 - 使用结构方式推荐

我需要更新我的答案。 现在-如果你需要一个struct ,你有两大选择:

一)只要使用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不是很大-尤其是前巨蟒-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

以上你只读属性,它是值对象确定(例如像那些在领域驱动设计),但你也可以提供制定者 - 这样你的类就能够承担责任,你有领域 - 例如做一些验证等等。(如果你有制定者,你可以指定在构造函数中使用它们,即self.foo = foo ,而不是直接self._foo = foo ,但仔细的制定者可以假设其它字段设置为已初始化,然后你需要在构造函数中定义验证)。



Answer 4:

我增加了一个额外的方法上我的课

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

问题解决了



文章来源: What does pylint's “Too few public methods” message mean
标签: python pylint