一部のコードでPylintを実行しているときに、「パブリックメソッドが少なすぎます(0/2)」というエラーを受け取ります。このメッセージはどういう意味ですか?pylintドキュメントは有用ではありません。
クラスのパブリックメソッドが少なすぎる場合に使用されるので、それだけの価値があることを確認してください。
一部のコードでPylintを実行しているときに、「パブリックメソッドが少なすぎます(0/2)」というエラーを受け取ります。このメッセージはどういう意味ですか?pylintドキュメントは有用ではありません。
クラスのパブリックメソッドが少なすぎる場合に使用されるので、それだけの価値があることを確認してください。
回答:
エラーは基本的に、クラスを辞書として扱うため、クラスはデータを格納するだけのものではないことを示しています。クラスには、保持するデータを操作するための少なくともいくつかのメソッドが必要です。
クラスが次のようになっている場合:
class MyClass(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
辞書またはnamedtuple
代わりの使用を検討してください。クラスが最適だと思われる場合は、それを使用してください。pylintは常に何が最良かを認識しているわけではありません。
namedtuple
は不変であり、インスタンス化時に割り当てられた値は後で変更できないことに注意してください。
dict
またはを使用しnamedtuple
ます。オブジェクトにロジックを追加する場合は、クラスを使用します(たとえば、オブジェクトの作成時に何かを実行したい場合、追加時に特別な処理を実行する必要がある場合、オブジェクトに対していくつかの操作を実行したい場合、その方法を制御したい場合)表示されるなど)
namedtuple
吸う-醜い構文を持っている上に、それを文書化したり、デフォルト値を簡単に提供したりすることはできません。
namedtuple
決断を後悔しました。名前付きアクセスとインデックス付きアクセスの両方の属性を許可することは一貫していません。
クラスを拡張している場合、私の提案は、この警告を体系的に無効にして、次に進むことです(たとえば、Celeryタスクの場合)。
class MyTask(celery.Task): # pylint: disable=too-few-public-methods
"""base for My Celery tasks with common behaviors; extends celery.Task
...
単一の関数のみを拡張する場合でも、このテクニックを機能させるにはクラスが必要です。拡張は、サードパーティのクラスをハックするよりも間違いなく優れています。
min-public-methods=0
に[BASIC]
設定ファイルのセクション。これにより、disable=
(内の[MESSAGE CONTROL]
)すべてのものとは別の行に配置できます。これにより、構成の変更とともに、有効化および無効化した理由に関する詳細なコメントを簡単に追加できます。
これは、pylint
ブラインドルールのもう1つのケースです。
「クラスはデータを格納するためのものではありません」-これは誤った説明です。辞書はすべてに適しているわけではありません。クラスのデータメンバーは意味があり、ディクショナリアイテムはオプションです。証明:dictionary.get('key', DEFAULT_VALUE)
を防ぐために行うことができますが、デフォルトKeyError
には単純なものはありません__getattr__
。
回答を更新する必要があります。現在-が必要な場合はstruct
、2つの優れたオプションがあります。
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でも置換する)を記述しないなど。
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
文字列の説明から作成された-は醜く、悪く、「文字列リテラル内でのプログラミング」は愚かです。
私は現在の2つの回答(「他のものを使用することを検討してください。ただし、パイリントは常に正しいとは限りません」)に同意します。
もう一度指摘しておきます。一部のクラスは、データを格納することのみを目的としています。
考慮すべきオプション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
、directの代わりに、コンストラクターでそれらを使用して割り当てることができますがself._foo = foo
、セッターは他のフィールドがすでに初期化されていると想定している可能性があり、コンストラクターでカスタム検証が必要です) 。
attrs
ライブラリを使用できdataclasses
ます。これは、実際にはモジュールを作成するための青写真でした。
namedtuples
継承のための奇妙な構文があります... 1つを使用するすべてのクラスに、それが名前付きタプルであることを認識し、の__new__
代わりに使用することを要求します__init__
。 dataclasses
この制限はありません
上司が単一の責任原則を期待するのは難しいですが、ピリントはそうではないと言います。したがって、クラスに2番目のメソッドを追加して、クラスが単一責任の原則に違反するようにします。あなたが単一の責任の原則をとるつもりであることがどれほど意図されているかは、見る人の目にあります。
私の修正、
クラスにメソッドを追加したので、2つの処理を実行します。
def __str__(self):
return self.__class__.__name__
クラスを2つの別々のファイルに分割する必要があるのかと思っています。モジュールも同様です。
問題は解決しましたが、仕様の問題を解決するのではなく、終日仕様を議論している同僚と一緒ではありません。