일부 코드에서 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__
, 읽기 전용 객체 ( namedtuples
Python 2에서도 를 대체하기 위해) 등을 작성하지 않습니다 .
b) 사용 dataclasses
(Py 3.7+)
hwjp의 의견에 따라 다음을 권장합니다 dataclasses
.
https://docs.python.org/3/library/dataclasses.html
이 기능은 거의 비슷하며 attrs
Python 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 개의 개별 파일로 분할해야하는지, 모듈도 마찬가지인지 궁금합니다.
문제는 해결되었지만 하루 종일 사양에 대해 논쟁하는 동료 들과는 어울리지 않았습니다.