더 나은 목록/세트/딕셔너리 이해를 작성하는 데 도움이 되는 flake8 플러그인입니다.
Django 프로젝트를 린팅하시나요? Flake8 및 기타 여러 코드 품질 도구를 다루는 내 책 Boost Your Django DX를 확인하세요.
Python 3.9~3.13이 지원됩니다.
먼저 pip
로 설치합니다.
python -m pip install flake8-comprehensions
둘째, Flake8의 select
설정을 정의하는 경우 C4
접두사를 추가합니다. 그렇지 않으면 플러그인이 기본적으로 활성화되어야 합니다.
<list/set/dict>
이해력으로 다시 작성합니다.규칙:
생성기 표현식 주위에 list
, set
또는 dict
사용할 필요가 없습니다. 이러한 유형에 대해 동등한 이해가 있기 때문입니다. 예를 들어:
list(f(x) for x in foo)
[f(x) for x in foo]
로 다시 작성합니다.set(f(x) for x in foo)
{f(x) for x in foo}
로 다시 작성합니다.dict((x, f(x)) for x in foo)
{x: f(x) for x in foo}
로 다시 작성합니다.<set/dict>
이해로 다시 작성합니다.규칙:
set
또는 dict
호출 내에서 목록 이해를 사용하는 것은 불필요합니다. 이러한 유형에 대해 동등한 이해가 있기 때문입니다. 예를 들어:
set([f(x) for x in foo])
{f(x) for x in foo}
로 다시 작성합니다.dict([(x, f(x)) for x in foo])
{x: f(x) for x in foo}
로 다시 작성합니다.<list/tuple>
리터럴 - <set/dict>
리터럴로 다시 작성합니다.<list/tuple>
리터럴 - 집합 리터럴로 다시 작성합니다.<list/tuple>
리터럴 - dict 리터럴로 다시 작성합니다. set
또는 dict
호출 내에서 목록이나 튜플 리터럴을 사용하는 것은 불필요합니다. 예를 들어:
set([1, 2])
{1, 2}
로 다시 작성set((1, 2))
{1, 2}
로 다시 작성합니다.set([])
set()
으로 다시 작성합니다.dict([(1, 2)])
{1: 2}
로 다시 작성합니다.dict(((1, 2),))
{1: 2}
로 다시 작성합니다.dict([])
{}
로 다시 작성<dict/list>
이해 - <builtin>
이 생성기를 사용할 수 있음이 규칙은 버그로 이어질 수 있는 게으름의 증가를 촉진했기 때문에 버전 3.4.0에서 삭제되었습니다.
<dict/list/tuple>
호출 - 리터럴로 다시 작성합니다. 빈 리터럴을 사용하는 것보다 dict()
호출하는 것이 더 느립니다. 왜냐하면 dict
이름이 리바운드된 경우 전역 범위에서 조회해야 하기 때문입니다. 여기의 다른 두 가지 기본 유형도 마찬가지입니다. 예를 들어:
dict()
{}
로 다시 작성dict(a=1, b=2)
{"a": 1, "b": 2}
로 다시 작성합니다.list()
[]
로 다시 작성tuple()
()
로 다시 작성합니다.<list/tuple>
<list/tuple>
() - <advice>
에 전달되었습니다.규칙:
<list/tuple>
tuple() - <advice>
에 전달되었습니다.<advice>
에 전달되었습니다. 여기서 <advice>
는 다음 중 하나입니다.
<list/tuple>
에 대한 외부 호출을 제거합니다().<list/tuple>
리터럴로 다시 작성 list 또는 tuple
호출 내에서 list
또는 tuple 리터럴을 사용하는 것은 불필요합니다. 이러한 유형에 대한 리터럴 구문이 있기 때문입니다. 예를 들어:
tuple([1, 2])
(1, 2)
로 다시 작성합니다.tuple((1, 2))
(1, 2)
로 다시 작성합니다.tuple([])
()
로 다시 작성합니다.list([1, 2])
[1, 2]
로 다시 작성list((1, 2))
[1, 2]
로 다시 작성list([])
[]
로 다시 작성 목록 이해를 중심으로 list
사용하는 것은 필요하지 않습니다. 목록이 없으면 동일하기 때문입니다. 예를 들어:
list([f(x) for x in foo])
[f(x) for x in foo]
로 다시 작성합니다.<dict/list/set>
이해 - 'in'은 생성기를 사용할 수 있습니다.이 규칙은 버그로 이어질 수 있는 게으름의 증가를 촉진했기 때문에 버전 3.4.0에서 삭제되었습니다.
<list/reversed>
호출이 있습니다. 이미 목록을 반환하므로 sorted()
list()
()를 사용할 필요가 없습니다. sorted()
에는 reverse
인수가 있으므로 reversed()
사용할 필요도 없습니다. 예를 들어:
list(sorted([2, 3, 1]))
sorted([2, 3, 1])
로 다시 작성합니다.reversed(sorted([2, 3, 1]))
sorted([2, 3, 1], reverse=True)
로 다시 작성합니다.reversed(sorted([2, 3, 1], reverse=True))
sorted([2, 3, 1])
로 다시 작성합니다.<list/reversed/set/sorted/tuple>
> () 내에서 불필요한 <list/set/sorted/tuple>
호출이 있습니다. list
/ set
/ sorted
/ tuple
내에 나열된 함수를 래핑하여 반복 가능 항목을 이중 캐스팅하거나 이중 처리할 필요가 없습니다. 예를 들어:
list(list(iterable))
list(iterable)
으로 다시 작성합니다.list(tuple(iterable))
list(iterable)
으로 다시 작성합니다.tuple(list(iterable))
tuple(iterable)
로 다시 작성합니다.tuple(tuple(iterable))
tuple(iterable)
로 다시 작성합니다.set(set(iterable))
set(iterable)
로 다시 작성합니다.set(list(iterable))
set(iterable)
로 다시 작성합니다.set(tuple(iterable))
set(iterable)
로 다시 작성합니다.set(sorted(iterable))
set(iterable)
로 다시 작성합니다.set(reversed(iterable))
set(iterable)
로 다시 작성합니다.sorted(list(iterable))
sorted(iterable)
로 다시 작성하세요.sorted(tuple(iterable))
sorted(iterable)
로 다시 작성하세요.sorted(sorted(iterable))
sorted(iterable)
로 다시 작성하세요.sorted(reversed(iterable))
sorted(iterable)
로 다시 작성하세요.<reversed/set/sorted>
() 내에서 iterable의 불필요한 아래 첨자를 반전했습니다.나열된 함수 중 하나에 반복 가능 항목을 전달하면 순서가 다시 변경되므로 반복 가능 항목의 순서를 바꿀 필요가 없습니다. 예를 들어:
set(iterable[::-1])
set(iterable)
로 다시 작성합니다.sorted(iterable)[::-1]
sorted(iterable, reverse=True)
로 다시 작성하세요.reversed(iterable[::-1])
iterable
으로 다시 작성<dict/list/set>
이해 - <dict/list/set>
()를 사용하여 다시 작성하세요. 요소가 변경되지 않은 경우 데이터 구조를 구축하기 위해 dict/list/set 컴프리헨션을 사용할 필요가 없습니다. 대신 dict()
, list()
또는 set()
사용하여 반복 가능 항목을 래핑하세요. 예를 들어:
{a: b for a, b in iterable}
dict(iterable)
로 다시 작성합니다.[x for x in iterable]
list(iterable)
로 다시 작성합니다.{x for x in iterable}
set(iterable)
로 다시 작성합니다.map
사용 - 생성기 표현식/ <list/set/dict>
이해를 사용하여 다시 작성합니다. map(func, iterable)
func
내장 함수일 때 뛰어난 성능을 발휘하며 함수에 이미 이름이 있으면 의미가 있습니다. 그러나 func이 lambda
인 경우 함수 호출 오버헤드를 방지하므로 생성기 표현식이나 이해력을 사용하는 것이 더 빠릅니다. 예를 들어:
map(lambda x: x + 1, iterable)
(x + 1 for x in iterable)
로 다시 작성합니다.map(lambda item: get_id(item), items)
을 (get_id(item) for item in items)
로 다시 작성합니다.list(map(lambda num: num * 2, nums))
를 [num * 2 for num in nums]
set(map(lambda num: num % 2 == 0, nums))
를 {num % 2 == 0 for num in nums}
dict(map(lambda v: (v, v ** 2), values))
{v : v ** 2 for v in values}
로 다시 작성합니다.<dict/dict comprehension>
dict()에 전달되었습니다. - dict()에 대한 외부 호출을 제거합니다. 두 구문 모두 이미 dict를 구성하고 있으므로 dict 리터럴이나 dict comprehension 주위에 dict
사용하는 것은 불필요합니다. 예를 들어:
dict({})
{}
로 다시 작성dict({"a": 1})
{"a": 1}
로 다시 작성합니다.<any/all>
()의 불필요한 목록 이해로 인해 단락이 방지됩니다. 생성기로 다시 작성하세요. any()
/ all()
호출 내에서 목록 이해를 사용하면 True
/ False
값이 발견될 때 단락이 방지됩니다. 전체 목록은 any()
/ all()
호출하기 전에 구성되므로 잠재적으로 work.part-way를 낭비하게 됩니다. 부분적으로 중지될 수 있는 생성기 표현식을 사용하도록 다시 작성합니다. 예를 들어:
all([condition(x) for x in iterable])
all(condition(x) for x in iterable)
로 다시 작성합니다.any([condition(x) for x in iterable])
any(condition(x) for x in iterable)
로 다시 작성합니다. 모든 값이 동일한 상수로 설정된 dict를 작성하기 위해 dict comprehension을 사용할 필요가 없습니다. 대신 dict.fromkeys()
사용하면 더 빠릅니다. 예를 들어:
{x: 1 for x in iterable}
dict.fromkeys(iterable, 1)
로 다시 작성합니다.{x: None for x in iterable}
dict.fromkeys(iterable)
로 다시 작성합니다.