web-dev-qa-db-ja.com

Pylintの "too-many-instance-attributes"メッセージに対処する方法は?

私はPylintでいくつかのコードをリントしようとしましたが、最後の残りのエラーは

R0902: too-many-instance-attributes (8/7)

インスタンス属性の数を制限する理由は理解できますが、7つは少し低いようです。私はまた、リンターが最後の言葉を持ってはならないことを理解しています。ただし、次の代わりに何をすべきかを知りたいです。

def __init__(self, output_file=None, output_dir=None):
    """
    Set the frobnicator up, along with default geometries
    """

    self.margin = 30

    self.pos = [0, 0]
    self.sep = [5, 5]

    self.cell = [20, 20]

    self.frobbr = library.Frobbr()

    page = self.frobbr.get_settings('page')

    self.lim = [page.get_width() - self.margin,
                page.get_height() - self.margin]

    self.filename = output_file
    self.moddir = output_dir

ジオメトリをディクショナリにパッケージ化するか、Pylintが文句を言うのを止めるために何か他のことをするか、それを単に無視する必要がありますか(実際にはしたくない)。

45
Inductiveload

リンターの仕事は、コードの潜在的な問題を認識させることであり、質問で言うように、最後のワードを持たないようにする必要があります。

パイリントが言うべきことを検討し、このクラスにあなたが持っている属性が適切であると判断した場合(これは合理的だと思われます)、エラーを抑制し、無効化を追加することで問題を検討したことを示すことができますクラスにコメントする:

class Frobnicator:

    """All frobnication, all the time."""

    # pylint: disable=too-many-instance-attributes
    # Eight is reasonable in this case.

    def __init__(self):
        self.one = 1
        self.two = 2
        self.three = 3
        self.four = 4
        self.five = 5
        self.six = 6
        self.seven = 7
        self.eight = 8

そうすれば、あなたはPylintもその奴隷も無視していないことになります。あなたはそれが役に立つが間違いやすいツールとしてそれを使用しています。

デフォルトでは、チェックをローカルで無効にすると、Pylintは情報メッセージを生成します。

 Locally disabling too-many-instance-attributes (R0902) (locally-disabled)

次の2つの方法のいずれかでthatメッセージが表示されないようにできます。

  1. Pylintの実行時にdisable=フラグを追加します。

    $ pylint --disable=locally-disabled frob.py 
    
  2. pylintrc構成ファイルにディレクティブを追加します。

    [MESSAGES CONTROL]
    disable = locally-disabled
    
57
Zero Piraeus

これはイデオロギー的な異論ですが、個人的には、このような変更を可能な限り普遍的にしようとする傾向があります。 7が1つのファイルに十分なインスタンスではなく、ここでそれを許可することを選択した場合、なぜどこでもできないのですか?私は常に全体の糸くずの規則を変更するわけではありませんが、少なくともそれを考慮します。そのために、全面的な変更を行う場合は、.pylintrcファイルでmax-attributes=7DESIGNセクション。

7は全体的に少し低いと思うので、変更しました。

[DESIGN]
max-attributes=7

max-attributes=12
17
Ian

Zero Piraeusからの答えは良いものです。つまり、実際のクラス名ではなく、initメソッドにコンテキストをほとんど提供しないため、肯定することは困難ですが、ファイル名とmoddirにはマージン、位置、等.

IO操作は多くの場合、メソッドに入れるのではなく、関数に分離するのが最適です。多くの場合、それらは多くの異なる形式とシリアル化オプションであり、ほとんどの場合、それらをオブジェクトロジック(メソッド)と混ぜたくないです。さまざまなファイル、文字列、blobなどを受け取り、エンコードされたオブジェクトを返す新しいIO関数を追加する方が、さまざまな方法で処理する多くのメソッドを持つオブジェクトを維持するよりも簡単ですIO操作。

5
NChauvat