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

일부 코드에서 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

위에는 읽기 전용 속성이 있습니다. 이는 Value Object (예 : Domain Driven Design의 속성과 같은)에 적합하지만 setter를 제공 할 수도 있습니다. 이렇게하면 클래스가 보유한 필드에 대해 책임을 질 수 있습니다. 몇 가지 유효성 검사 등을 수행합니다. (setter가있는 경우 self.foo = foo직접 대신 생성자에서이를 사용하여 할당 할 수 self._foo = foo있지만 신중하게 설정자는 다른 필드가 이미 초기화되었다고 가정 할 수 있으며 생성자에서 사용자 지정 유효성 검사가 필요합니다) .


답변

상사가 단일 책임 원칙을 기대하는 것은 어렵지만 Pylint는 아니오라고 말합니다. 따라서 클래스가 단일 책임 원칙을 위반하도록 두 번째 방법을 클래스에 추가하십시오. 단일 책임 원칙을 얼마나 멀리 가져야하는지는 보는 사람의 눈에 달려 있습니다.

내 수정,

클래스에 메서드를 추가 했으므로 이제 두 가지 작업을 수행합니다.

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

지금 내 클래스를 2 개의 개별 파일로 분할해야하는지, 모듈도 마찬가지인지 궁금합니다.

문제는 해결되었지만 하루 종일 사양에 대해 논쟁하는 동료 들과는 어울리지 않았습니다.


답변