source

Pylint의 "너무 적은 공공 방법" 메시지는 무엇을 의미합니까?

bestscript 2023. 7. 19. 22:38

Pylint의 "너무 적은 공공 방법" 메시지는 무엇을 의미합니까?

일부 코드에서 Pylint를 실행하고 있는데 "Too lunnel 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

    ...             

단 하나의 기능만 확장하더라도 이 기술을 작동시키기 위해서는 클래스가 반드시 필요하며, 타사 클래스에서 해킹하는 것보다 확장하는 것이 확실히 더 좋습니다!

이것은 필린트의 맹목적인 규칙의 또 다른 사례입니다.

데이터를 것이 - 진술입니다."클래스는 데이터를 저장하기 위한 것이 아닙니다." - 잘못된 설명입니다.사전이 모든 것에 좋은 것은 아닙니다.클래스의 데이터 멤버는 의미 있는 것이고 사전 항목은 선택적인 것입니다.할 수 요: 할 수 .dictionary.get('key', DEFAULT_VALUE)을 방지하기 위해KeyError 하만간것없은습다니한단지▁simple▁no▁is다없▁but니▁there__getattr__결석으로

구조체를 사용하는 권장 방법

제 답변을 업데이트해야 합니다.지금 당장 - 만약 당신이 필요하다면.struct에게는 두 선택지가 : 가지훌륭옵있션습다두니이한두다▁you있.

그냥 사용하기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) 등에서도 사용할 수 있습니다.

용을 합니다.dataclasses(그림 3.7+)

hwjp님의 hwjp님의 hwjp님의 hwjp님의 hwjp님의 hwjp님의 hwjp님을 dataclasses:

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

이것은 거의 같은 수준입니다.attrsPython 3.7+를 제외하고는 별도의 종속성이 없는 표준 라이브러리 메커니즘("배터리 포함")입니다.

나머지 이전 답변

NamedTuple좋지 않습니다 - 특히 Python 3의 이전 버전.typing.NamedTuple: https://docs.python.org/3/library/typing.html#typing.NamedTuple

  • 당신은 분명히 "에서 파생된 클래스"를 확인해야 합니다.NamedTuple무늬를 넣다파이썬 2 -namedtuples문자열 설명에서 생성됨 - 못생기고, 나쁘고, "문자열 리터럴 내부의 프로그래밍" 바보 같은 것입니다.

저는 현재 두 가지 답변("다른 것을 사용하는 것을 고려하지만, 필린트가 항상 옳은 것은 아닙니다."와 "필린트가 댓글을 억제하는 것을 사용합니다.")에 동의하지만, 저는 제 나름의 제안이 있습니다.

다시 한 번 말씀드리겠습니다.일부 클래스는 데이터를 저장하기 위한 입니다.

이제 사용도 고려할 수 있는 옵션입니다.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

위에는 Value Object(예: 도메인 기반 설계의 속성)에 대해 OK인 읽기 전용 속성이 있지만 세터를 제공할 수도 있습니다. 이렇게 하면 클래스가 사용자가 가지고 있는 필드에 대해 책임을 질 수 있습니다. 예를 들어, 세터가 있는 경우 생성자에서 이러한 속성을 사용하여 할당할 수 있습니다.self.foo = foo직접적인 대신에self._foo = foo그러나 세터는 다른 필드가 이미 초기화되었다고 가정할 수 있으므로 생성자에서 사용자 정의 유효성 검사가 필요합니다.

당신의 상사가 단일 책임 원칙을 기대할 때는 힘들지만, 필린트는 아니라고 합니다.따라서 수업에 두 번째 방법을 추가하여 수업이 단일 책임 원칙을 위반하도록 하십시오.당신이 단일 책임 원칙을 어디까지 가져가야 하는지는 보는 사람의 눈에 달려 있습니다.

나의 해결책!

저는 수업에 추가적인 방법을 추가해서 이제 두 가지 일을 합니다.

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

저는 지금 제 수업을 두 개의 개별 파일과 모듈로 나누어야 하는지 궁금합니다.

문제는 해결되었습니다. 하지만 제 동료들이 하루 종일 사양에 대해 논쟁을 벌이는 것은 아닙니다. 삶과 죽음처럼 말이죠.

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