E731 람다 식을 할당하지 않고 def를 사용하십시오.
람다 식을 사용할 때 마다이 pep8 경고가 나타납니다. 람다 식은 권장되지 않습니까? 왜 그렇지 않습니까?
PEP-8 의 권장 사항 은 다음과 같습니다.
람다 식을 이름에 직접 바인딩하는 대 입문 대신 항상 def 문을 사용하십시오.
예:
def f(x): return 2*x
아니:
f = lambda x: 2*x
첫 번째 형식은 결과 함수 객체의 이름이 일반 '<lambda>'대신 'f'임을 의미합니다. 이것은 일반적으로 트레이스 백 및 문자열 표현에 더 유용합니다. 대 입문을 사용하면 람다식이 명시적인 def 문에 제공 할 수있는 유일한 이점을 제거 할 수 있습니다 (즉, 더 큰 식 안에 포함시킬 수 있음).
람다를 이름에 할당하면 기본적으로 기능이 복제되므로 def
일반적으로 혼동을 피하고 명확성을 높이기 위해 한 가지 방법을 사용하는 것이 가장 좋습니다.
람다의 합법적 사용 사례는 함수를 할당하지 않고 사용하려는 경우입니다.
sorted(players, key=lambda player: player.rank)
간단한 작업의 경우, 모듈 에 몇 가지 유용한 옵션을 제공합니다 , 그리고 , 항목 (들) 및 호출 방법을 종종 단지 속성 (들)에 액세스하는 labmdas을 대체 할 수있다.operator
attrgetter
itemgetter
methodcaller
예를 들어, 위와 같이 수행 할 수 있습니다 operator.attrgetter
.
sorted(players, key=operator.attrgetter('rank'))
여기에 이야기가 있습니다. 두 번 사용했던 간단한 람다 함수가 있습니다.
a = map(lambda x : x + offset, simple_list)
b = map(lambda x : x + offset, another_simple_list)
이것은 단지 표현을위한 것이며, 나는 이것의 다른 버전에 직면했습니다.
이제 DRY를 유지하기 위해이 일반적인 람다를 재사용하기 시작합니다.
f = lambda x : x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
이 시점에서 내 코드 품질 검사기는 람다가 명명 된 함수라는 것에 대해 불평하므로 함수로 변환합니다.
def f(x):
return x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
이제 검사기는 함수가 앞뒤로 하나의 빈 줄로 묶여 있어야한다고 불평합니다.
def f(x):
return x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
여기 우리는 가독성을 높이 지 않고 파이 토닉을 증가시키지 않고 원래 2 줄 대신 6 줄의 코드를 가지고 있습니다. 이 시점에서 코드 검사기는 docstring이없는 함수에 대해 불평합니다.
제 생각에는이 규칙을 피하고 깨뜨리는 것이 좋습니다. 판단력을 사용하십시오.
Lattyware는 절대적으로 옳습니다. 기본적으로 PEP-8 은 다음과 같은 것을 피하기를 원합니다.
f = lambda x: 2 * x
대신에
def f(x):
return 2 * x
그러나 최근 버그 보고서 (2014 년 8 월)에서 언급 한대로 다음과 같은 내용은 이제 호환됩니다.
a.f = lambda x: 2 * x
a["f"] = lambda x: 2 * x
내 PEP-8 검사기가 아직 올바르게 구현하지 않았기 때문에 당분간 E731을 해제했습니다.
또한 def (ined) 함수를 사용하는 것이 불가능한 상황에 직면했습니다.
class SomeClass(object):
# pep-8 does not allow this
f = lambda x: x + 1 # NOQA
def not_reachable(self, x):
return x + 1
@staticmethod
def also_not_reachable(x):
return x + 1
@classmethod
def also_not_reachable(cls, x):
return x + 1
some_mapping = {
'object1': {'name': "Object 1", 'func': f},
'object2': {'name': "Object 2", 'func': some_other_func},
}
이 경우 클래스에 속한 매핑을 만들고 싶었습니다. 매핑의 일부 객체에는 동일한 기능이 필요했습니다. 명명 된 함수를 클래스 외부에 두는 것은 비논리적입니다. 클래스 본문 내부에서 메서드 (정적 메서드, 클래스 메서드 또는 일반)를 참조하는 방법을 찾지 못했습니다. 코드가 실행될 때 SomeClass가 아직 존재하지 않습니다. 따라서 수업에서 그것을 언급하는 것도 불가능합니다.
참고 : https://stackoverflow.com/questions/25010167/e731-do-not-assign-a-lambda-expression-use-a-def
'Programming' 카테고리의 다른 글
루비 클래스 인스턴스 변수와 클래스 변수 (0) | 2020.05.26 |
---|---|
SQL Server에서 중첩 된 사례 명령문 논리를 수행하는 가장 좋은 방법 (0) | 2020.05.26 |
git pull이 자동으로 서브 모듈을 업데이트하는 방법이 있습니까? (0) | 2020.05.26 |
루비에서 proc와 람다의 차이점은 무엇입니까? (0) | 2020.05.26 |
PHP를 통해 파일을 삭제하는 방법? (0) | 2020.05.26 |