문제

람다 표현식을 사용할 때마다 이 pep8 경고가 표시됩니다.람다 표현식은 권장되지 않나요?그렇지 않다면 왜?

도움이 되었습니까?

해결책

의 추천 PEP-8 당신이 겪고 있는 상황은 다음과 같습니다:

Lambda 표현식을 이름에 직접 묶는 할당 문 대신 DEF 문을 항상 사용하십시오.

예:

def f(x): return 2*x 

아니요:

f = lambda x: 2*x 

첫 번째 형태는 결과 함수 객체의 이름이 특히 일반 대신 'f'라는 것을 의미합니다.u003Clambda> '.이것은 일반적으로 추적 및 문자열 표현에 더 유용합니다.과제 진술을 사용하면 Lambda 표현이 명시적인 DEF 문 (즉더 큰 표현식 안에 포함될 수 있음)

이름에 람다를 할당하면 기본적으로 다음의 기능이 복제됩니다. def - 일반적으로 혼란을 피하고 명확성을 높이기 위해 단일 방식으로 작업하는 것이 가장 좋습니다.

람다의 합법적인 사용 사례는 함수를 할당하지 않고 사용하려는 경우입니다. 예:

sorted(players, key=lambda player: player.rank)

간단한 조작의 경우, 그만큼 operator 기준 치수 몇 가지 유용한 옵션을 제공합니다. attrgetter, itemgetter 그리고 methodcaller 이는 속성, 항목 및 호출 메서드에만 액세스하는 labmdas를 대체할 수 있는 경우가 많습니다.

예를 들어, 위의 작업은 다음과 같이 수행될 수 있습니다. 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)
.

이것은 표현을위한 것입니다. 나는 이것의 두 개의 다른 버전을 직면하게되었습니다.

이제, 일을 건조하게하기 위해, 나는이 공통 람다를 재사용하기 시작합니다.

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)
.

여기에서는 가독성이 증가하지 않고 Pythonic의 증가가없는 원래 2 라인 대신에 6 줄의 코드가 있습니다.이 시점에서 코드 검사기는 DocStrings가없는 함수에 대해 불평합니다.

제 의견 으로이 규칙은 의미가있을 때 피할 수없고 부서지는 것이 좋습니다. 판단을 사용하십시오.

lattyware는 절대적으로 바로 맞습니다 : 기본적으로 PEP-8 당신이 사물을 피하기를 원합니다.

처럼
f = lambda x: 2 * x
.

및 대신

를 사용하십시오.
def f(x):
    return 2 * x
.

최근 BuGreport (2014 년 8 월)에서 해결 된대로 다음과 같은 진술은 이제 다음과 같은 진술을 준수합니다.:

a.f = lambda x: 2 * x
a["f"] = lambda x: 2 * x
.

내 PEP-8 검사기가 아직 올바르게 구현되지 않으므로 시간은 꺼졌습니다.

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},
  }
.

이 경우에는 정말로 클래스에 속한 매핑을 만들고 싶었습니다.맵핑의 일부 객체는 동일한 기능이 필요했습니다.클래스 외부에 명명 된 기능을 넣는 것은 비논리적 일 것입니다. 나는 클래스 본문 내부에서 메소드 (staticmethod, classmethod 또는 normal)를 참조 할 수있는 방법을 찾지 못했습니다.SomeClass는 코드가 실행되면 아직 없습니다.그래서 클래스에서 언급 할 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top