2024-05-15 09:48:50 发布
网友
我正在一些代码上运行pylint,并收到错误“公共方法太少(0/2)”。这个信息是什么意思?pylint docs没有帮助:
Used when class has too few public methods, so be sure it's really worth it.
这个错误基本上说类并不意味着存储数据,因为您基本上将类视为字典。类应该至少有几个方法来操作它们所保存的数据。
如果你的班级是这样的:
class MyClass(object): def __init__(self, foo, bar): self.foo = foo self.bar = bar
考虑改用字典或namedtuple。虽然如果一个类看起来是最好的选择,使用它。派林特并不总是知道什么是最好的。
namedtuple
请注意,namedtuple是不可变的,以后不能修改在实例化时分配的值。
这是pylint盲规则的另一种情况。
pylint
“类不是用来存储数据的”-这是一个错误的语句。字典不是万能的。类的数据成员是有意义的,字典项是可选的。证明:您可以通过dictionary.get('key', DEFAULT_VALUE)来防止KeyError,但是没有默认的简单__getattr__。
dictionary.get('key', DEFAULT_VALUE)
KeyError
__getattr__
我需要更新我的答案。现在-如果你需要一个struct,你有两个很好的选择:
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__、只读对象(甚至在Python 2中替换namedtuples)等等。
__repr__
namedtuples
dataclasses
根据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很难看,很糟糕,而且“在字符串文本中编程”很愚蠢。
NamedTuple
typing.NamedTuple
我同意目前的两个答案(“考虑使用其他方法,但是pylint并不总是正确的”——接受的答案,以及“使用pylint抑制注释”),但我有自己的建议。
让我再指出一次:有些类意味着只是来存储数据。
现在也可以考虑使用property-ies。
property
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可能假设已经初始化了其他字段,然后需要在构造函数中进行自定义验证)。
self.foo = foo
self._foo = foo
如果您要扩展一个类,那么我的建议是系统地禁用此警告并继续,例如,在芹菜任务中:
class MyTask(celery.Task): # pylint: disable=too-few-public-methods """base for My Celery tasks with common behaviors; extends celery.Task ...
即使你只是扩展一个函数,你肯定需要一个类来实现这个技术函数,而且扩展绝对比攻击第三方类要好!
这个错误基本上说类并不意味着存储数据,因为您基本上将类视为字典。类应该至少有几个方法来操作它们所保存的数据。
如果你的班级是这样的:
考虑改用字典或
namedtuple
。虽然如果一个类看起来是最好的选择,使用它。派林特并不总是知道什么是最好的。请注意,
namedtuple
是不可变的,以后不能修改在实例化时分配的值。这是
pylint
盲规则的另一种情况。“类不是用来存储数据的”-这是一个错误的语句。字典不是万能的。类的数据成员是有意义的,字典项是可选的。证明:您可以通过
dictionary.get('key', DEFAULT_VALUE)
来防止KeyError
,但是没有默认的简单__getattr__
。编辑-使用结构的推荐方法
我需要更新我的答案。现在-如果你需要一个
struct
,你有两个很好的选择:a) 只需使用
attrs
这是一个图书馆:
https://www.attrs.org/en/stable/
额外的功能:不编写构造函数、默认值、验证、
__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。上面您有只读属性,这对于值对象来说是可以的(例如,域驱动设计中的属性),但是您也可以提供setter-这样您的类就可以对您拥有的字段负责-例如,进行一些验证等(如果您有setter,您可以在构造函数中使用它们进行赋值,i、 e.
self.foo = foo
而不是直接的self._foo = foo
,但是要小心,setter可能假设已经初始化了其他字段,然后需要在构造函数中进行自定义验证)。如果您要扩展一个类,那么我的建议是系统地禁用此警告并继续,例如,在芹菜任务中:
即使你只是扩展一个函数,你肯定需要一个类来实现这个技术函数,而且扩展绝对比攻击第三方类要好!
相关问题 更多 >
编程相关推荐