programing tip

파일 린트의“너무 적은 공개 방법”메시지는 무엇을 의미합니까?

itbloger 2020. 8. 27. 07:26
반응형

파일 린트의“너무 적은 공개 방법”메시지는 무엇을 의미합니까?


일부 코드에서 pylint를 실행 중이며 "Too few public methods (0/2)"오류가 표시됩니다. 이 메시지는 무엇을 의미합니까? pylint의 문서가 도움이되지 않습니다 :

클래스에 공개 메서드가 너무 적을 때 사용되므로 그만한 가치가 있는지 확인하십시오.


이 오류는 기본적으로 클래스를 의미하지 않는 것을 말한다 단지 당신이 기본적으로 사전으로 클래스를 치료하고 같은 데이터를 저장. 클래스에는 보유한 데이터에 대해 작동 할 수있는 최소한 몇 가지 메서드가 있어야합니다.

수업이 다음과 같은 경우 :

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

사전 또는 namedtuple대신 사용을 고려하십시오 . 수업이 최선의 선택처럼 보이더라도 사용하십시오. 파일 린트는 항상 최선이 무엇인지 알지 못합니다.

그 노트를 수행 namedtuple불변이며, 인스턴스에 할당 된 값은 나중에 수정할 수 없습니다.


수업을 확장하는 경우에는이 경고를 체계적으로 비활성화하고 예를 들어 Celery 작업의 경우 계속 진행하는 것이 좋습니다.

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

    ...             

단일 함수 만 확장하더라도이 기술이 작동하도록하려면 클래스가 반드시 필요하며 확장은 타사 클래스를 해킹하는 것보다 확실히 낫습니다!


이것은 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__, 읽기 전용 객체 ( namedtuplesPython 2에서도 를 대체하기 위해) 등을 작성하지 않습니다 .

b) 사용 dataclasses(Py 3.7+)

hwjp의 의견에 따라 다음을 권장합니다 dataclasses.

https://docs.python.org/3/library/dataclasses.html

이 기능은 거의 비슷하며 attrsPython 3.7 이상을 제외하고 추가 종속성이없는 표준 라이브러리 메커니즘 ( "배터리 포함")입니다.

이전 답변의 나머지

NamedTuple크지 않다 - 특히 파이썬 3 개의 전에 typing.NamedTuple: https://docs.python.org/3/library/typing.html#typing.NamedTuple - 당신은 확실히 '에서 파생 된 클래스 체크 아웃해야 NamedTuple패턴을 ". 파이썬 2- namedtuples문자열 설명에서 생성 된-추악하고 나쁘고 "문자열 리터럴 내부 프로그래밍"바보입니다.

나는 현재의 두 가지 답변 ( "다른 것을 사용하는 것을 고려하지만 파일 린트가 항상 옳은 것은 아닙니다"-수락 된 답변과 "주석 억제 주석 사용")에 동의하지만, 나만의 제안이 있습니다.

나 하나에서 더 많은 시간을이 문제를 지적하자 일부 클래스는 의미 단지 데이터를 저장하는 데.

이제 고려할 옵션 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

Above you have read-only properties, which is OK for Value Object (e.g. like those in Domain Driven Design), but you can also provide setters - this way your class will be able to take responsibility for the fields which you have - for example to do some validation etc. (if you have setters, you can assign using them in the constructor, i.e. self.foo = foo instead of direct self._foo = foo, but careful, the setters may assume other fields to be initialized already, and then you need custom validation in the constructor).


I added an extra method to my class

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

problem solved

참고URL : https://stackoverflow.com/questions/14027417/what-does-pylints-too-few-public-methods-message-mean

반응형