Program Tip

Pylint가 내장 함수를 좋아하지 않는 이유는 무엇입니까?

programtip 2020. 10. 24. 11:41
반응형

Pylint가 내장 함수를 좋아하지 않는 이유는 무엇입니까?


다음과 같은 줄이 있습니다.

filter(lambda x: x == 1, [1, 1, 2])

Pylint가 경고를 표시합니다.

W:  3: Used builtin function 'filter'

왜 그런 겁니까? 목록 이해가 권장되는 방법입니까?

물론 다음과 같이 다시 작성할 수 있습니다.

[x for x in [1, 1, 2] if x == 1]

그리고 나는 경고를받지 않지만 이것에 대한 PEP가 있는지 궁금합니다.


Pylint는해서는 안되는 일에 대해 종종 수다를 떨칩니다. .pylintrc 파일에서 경고를 비활성화 할 수 있습니다.

이 페이지 http://pylint-messages.wikidot.com/messages:w0141 은 필터와 맵이 목록 이해로 대체되었다는 문제를 나타냅니다.

pylintrc 파일에 다음과 같은 줄이 있으면 경고가 사라집니다.

disable=W0141

왜 그런 겁니까? 목록 이해가 권장되는 방법입니까?

목록 이해가 추천 튜토리얼 예를 들어 어떤 상태,

더 간결하고 읽기 쉽습니다.

그리고 SO의 Python List Comprehension Vs 에 대한 대부분의 답변자에 의해. 지도이있다

  1. 매번 filter정의하는 것보다 목록 이해력을 사용하는 것이 더 효율적입니다.lambda
  2. 아마도 더 판독 (및 유사한 효율)를 사용하는 filter함수를 미리 정의되어 있으면
  3. 사용이 필요 filter하고 map당신이 경우
    • 지도 map,
    • 카레 map또는
    • 함수형 프로그래밍 사용

요약 : 대부분의 경우 목록 이해력 사용


나는 같은 문제에 부딪 쳤고 알아낼 수 없었다.

내장 함수 ʻinput '이 왜 나쁜지. 나는 당신이 의도

비활성화하려면 :

pylint --bad-functions = "[맵, 필터, 적용]"YOUR_FILE_TO_CHECK_HERE

설정이 마음에 들면 :

pylint --bad-functions="[map,filter,apply]" --some-other-supercool-settings-of-yours
--generate-rcfile > test.rc

설정이 파일에 있는지 확인하십시오. 예 :

cat test.rc | grep -i YOUR_SETTING_HERE

그 후에이 파일을 로컬에서 사용할 수 있습니다.

pylint --rcfile test.rc --your-other-command-line-args ...

또는 기본 rcfile로 사용하십시오. 이를 위해 나는 친절하게 당신을 추천합니다

pylint --long-help

내 프로젝트에 대해 동일한 경고가 있습니다. 소스 코드를 py2 / 3과 호환되도록 변경하고 있으며 pylint는 많은 도움이됩니다.

실행 pylint --py3k은 호환성에 대한 오류 만 표시합니다.

파이썬 2에서를 사용 filter하면 다음을 반환합니다 list.

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
[1, 1]
>>> type(my_list)
<type 'list'>

그러나 파이썬 3에서 filter와 다른 유사한 방법 ( map, range, zip, ..) 호환되지 않는 유형의 아마 코드에서 버그가 원인입니다 반복자를 반환합니다.

>>> my_list = filter(lambda x: x == 1, [1, 1, 2])
>>> my_list
<filter object at 0x10853ac50>
>>> type(my_list)
<class 'filter'>

코드 python 2/3과 호환되도록 만들기 위해 python future site 의 치트 시트를 사용합니다.

이 경고를 피하려면 Python 2 및 3에서 작동하는 4 가지 접근 방식을 사용할 수 있습니다.

1-당신이 말한 것처럼 목록 이해력 사용.

2 - Using a list function, grant that return always is a materialized list, result is same on both python versions

>>> list(filter(lambda x: x == 1, [1, 1, 2]))
[1, 1]

3 - Using lfilter, that's a future package import. It always return a list, uses filter on py2, and list(filter(..) on py3. So, both pythons got the same behaviour and you got a cleaner syntax.

>>> from future.utils import lfilter
>>> lfilter(lambda x: x == 1, [1, 1, 2])
[1, 1]

4 - The best! Use filter always on a loop, this way pylint don't give warnings, and it have a nice performance boost on python 3.

>>> for number in filter(lambda x: x == 1, [1, 1, 2]):
>>>     print(number)
>>> 1
>>> 1

Always prefer functions that works on python 3, because python 2 will be retired soon.

참고URL : https://stackoverflow.com/questions/3569134/why-doesnt-pylint-like-built-in-functions

반응형