Pylint가 올바르지 않은 것으로 간주하는 조건 값에서 len (SEQUENCE)을 사용하는 이유는 무엇입니까?
이 코드 스 니펫을 고려하면 :
from os import walk
files = []
for (dirpath, _, filenames) in walk(mydir):
# more code that modifies files
if len(files) == 0: # <-- C1801
return None
if 문이있는 줄에 관한이 메시지와 함께 Pylint에 의해 경고를 받았습니다.
[pylint] C1801 :
len(SEQUENCE)
조건 값으로 사용하지 마십시오
규칙 C1801은 언뜻보기에 매우 합리적으로 들리지 않았으며 참조 안내서 의 정의 는 이것이 왜 문제인지 설명하지 않습니다. 사실, 그것은 그것을 옳지 않은 사용 이라고 부릅니다 .
len-as-condition (C1801) : Pylint가 조건 내부에서 len (sequence)의 잘못된 사용을 감지 할 때 사용
len(SEQUENCE)
되는 조건 값으로 사용 하지 마십시오 .
나의 검색 시도도 나에게 더 깊은 설명을 제공하지 못했습니다. 나는 시퀀스의 길이 속성이 게으르게 평가 __len__
될 수 있고 부작용을 갖도록 프로그래밍 될 수 있음을 이해하지만 Pylint가 그러한 사용을 잘못 사용하기에 충분히 문제가되는지 여부는 의문의 여지가 있습니다. 따라서 규칙을 무시하도록 프로젝트를 구성하기 전에 추론에서 무언가가 누락되었는지 여부를 알고 싶습니다.
len(SEQ)
조건 값으로 사용하는 것이 언제 문제가됩니까? Pylint가 C1801로 피하려고하는 주요 상황은 무엇입니까?
len(SEQ)
조건 값으로 사용하는 것이 언제 문제가됩니까? Pylint가 C1801로 피하려고하는 주요 상황은 무엇입니까?
그것은 아니에요 정말 사용에 문제가 len(SEQUENCE)
- 그것은 (참조 효율적으로되지 않을 수 있지만 chepner의 의견을 ). Pylint는 PEP 8 스타일 가이드 를 준수하는지 코드를 확인 합니다.
시퀀스 (문자열, 목록, 튜플)의 경우 빈 시퀀스가 거짓이라는 사실을 사용하십시오.
Yes: if not seq: if seq: No: if len(seq): if not len(seq):
언어 사이에서 우연히 나오는 가끔 파이썬 프로그래머로서, 나는 len(SEQUENCE)
구문을 더 읽기 쉽고 명확하게 생각합니다 ( "명시 적 일수록 암시적일 것"이라고 생각합니다). 그러나 False
부울 컨텍스트에서 빈 시퀀스가 평가된다는 사실을 사용하는 것이 "Pythonic"으로 간주됩니다.
NumPy 배열을 사용할 때는 실제로 se (의 bool 값을 확인하는 대신) len (seq)을 사용해야합니다.
a = numpy.array(range(10))
if a:
print "a is not empty"
예외 : ValueError : 요소가 둘 이상인 배열의 실제 값이 모호합니다. a.any () 또는 a.all ()을 사용하십시오.
따라서 Python 목록과 NumPy 배열을 모두 사용하는 코드의 경우 C1801 메시지가 도움이되지 않습니다.
https://github.com/PyCQA/pylint/issues/2684 및 https://github.com/PyCQA/pylint/issues/1405를 수정 한 후 Pylint의 다음 릴리스에서 더 이상 불필요하게 불평하지 않아야합니다.
덕분에 PaulRenvoise , PCManticore 및 adhearn 이 고정에 자신의 작품에 대한!
예를 들어 if len(files) == 0
더 이상 pylint가 불평하지 않습니다.
Pylint는 내 코드에 실패했으며 연구를 통해이 게시물로 연결되었습니다.
../filename.py:49:11: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)
../filename.py:49:34: C1801: Do not use `len(SEQUENCE)` to determine if a sequence is empty (len-as-condition)
이것은 전에 내 코드였습니다.
def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
if len(dirnames) == 0 and len(filenames) == 0:
print("Exists: {} : Absolute Path: {}".format(
os.path.exists(fullpath), os.path.abspath(fullpath)))
이것은 내 코드 수정 후였습니다. 를 사용함으로써 int()
attribute
Pep8 / Pylint를 만족시킨 것 같고 내 코드에 부정적인 영향을 미치지 않는 것 같습니다.
def list_empty_folders(directory):
"""The Module Has Been Build to list empty Mac Folders."""
for (fullpath, dirnames, filenames) in os.walk(directory):
if len(dirnames).__trunc__() == 0 and len(filenames).__trunc__() == 0:
print("Exists: {} : Absolute Path: {}".format(
os.path.exists(fullpath), os.path.abspath(fullpath)))
내 수정
.__trunc__()
시퀀스에 추가함으로써 필요를 해결 한 것으로 보입니다.
나는 행동에 차이가 보이지 않지만 내가 누락 된 세부 사항을 아는 사람이 있으면 알려주십시오.
'IT' 카테고리의 다른 글
두 객체 사이의 일반적인 깊은 차이 (0) | 2020.05.14 |
---|---|
모든 브라우저의 사용자 에이전트가“Mozilla /”로 시작하는 이유는 무엇입니까? (0) | 2020.05.14 |
편안한 POST 응답을위한 '최상의'실습 (0) | 2020.05.14 |
Chrome에서 디버깅 할 때 스크립트 실행을 종료하는 방법은 무엇입니까? (0) | 2020.05.14 |
대상이 최신이라고 생각하는 이유는 무엇입니까? (0) | 2020.05.13 |