파일 린트의“너무 적은 공개 방법”메시지는 무엇을 의미합니까?
일부 코드에서 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
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
'programing tip' 카테고리의 다른 글
팹을 언제 사용하고 std :: abs를 사용하기에 충분합니까? (0) | 2020.08.27 |
---|---|
변수 인수 목록을 허용하는 다른 함수에 변수 인수 전달 (0) | 2020.08.27 |
Mercurial을 사용하면 푸시하기 전에 일련의 변경 세트를 하나로 "압축"할 수 있습니까? (0) | 2020.08.27 |
자바 스크립트에서 특정 오류 처리 (예외를 생각해보세요) (0) | 2020.08.27 |
Selenium-WebDriver에 Java에서 몇 초 동안 기다리도록 어떻게 요청할 수 있습니까? (0) | 2020.08.27 |