[python] “if x : return x”문을 피하는 파이썬 방식

특정 조건을 확인하기 위해 4 개의 다른 방법을 순서대로 호출하고 Truthy를 반환 할 때마다 즉시 (다음 중 하나를 확인하지 않음) 반환하는 방법이 있습니다.

def check_all_conditions():
    x = check_size()
    if x:
        return x

    x = check_color()
    if x:
        return x

    x = check_tone()
    if x:
        return x

    x = check_flavor()
    if x:
        return x
    return None

이것은 많은 수하물 코드처럼 보입니다. 각 2 줄 if 문 대신 다음과 같이하십시오.

x and return x

그러나 그것은 잘못된 파이썬입니다. 여기에 간단하고 우아한 솔루션이 누락 되었습니까? 또한이 상황에서 4 가지 검사 방법이 비쌀 수 있으므로 여러 번 호출하고 싶지 않습니다.



답변

루프를 사용할 수 있습니다 :

conditions = (check_size, check_color, check_tone, check_flavor)
for condition in conditions:
    result = condition()
    if result:
        return result

이는 이제 조건 수를 변수로 만들 수 있다는 이점이 있습니다.

당신은 사용할 수 map()+ filter()(사용, 파이썬 3 버전을 future_builtins버전 최초의 일치하는 값을 얻기 위해 파이썬 2 일) :

try:
    # Python 2
    from future_builtins import map, filter
except ImportError:
    # Python 3
    pass

conditions = (check_size, check_color, check_tone, check_flavor)
return next(filter(None, map(lambda f: f(), conditions)), None)

그러나 이것이 더 읽기 쉬운 것은 논쟁의 여지가 있습니다.

또 다른 옵션은 생성기 표현식을 사용하는 것입니다.

conditions = (check_size, check_color, check_tone, check_flavor)
checks = (condition() for condition in conditions)
return next((check for check in checks if check), None)


답변

Martijn의 정답 대신 체인을 연결할 수 or있습니다. 첫 번째 진실 된 값을 반환하거나 None진실 된 가치가없는 경우 :

def check_all_conditions():
    return check_size() or check_color() or check_tone() or check_flavor() or None

데모:

>>> x = [] or 0 or {} or -1 or None
>>> x
-1
>>> x = [] or 0 or {} or '' or None
>>> x is None
True


답변

바꾸지 마

다양한 다른 답변이 보여주는 것처럼이 작업을 수행하는 다른 방법이 있습니다. 원래 코드만큼 명확한 것은 없습니다.


답변

효과적으로 timgeb와 같은 대답이지만 더 나은 형식을 위해 괄호를 사용할 수 있습니다.

def check_all_the_things():
    return (
        one()
        or two()
        or five()
        or three()
        or None
    )


답변

Curly의 법칙 에 따르면 두 가지 우려를 나누면이 코드를 더 읽기 쉽게 만들 수 있습니다.

  • 무엇을 확인해야합니까?
  • 한 가지 사실이 돌아왔습니까?

두 가지 기능으로

def all_conditions():
    yield check_size()
    yield check_color()
    yield check_tone()
    yield check_flavor()

def check_all_conditions():
    for condition in all_conditions():
        if condition:
            return condition
    return None

이것은 피합니다 :

  • 복잡한 논리 구조
  • 정말 긴 줄
  • 되풀이

… 선형적이고 읽기 쉬운 흐름을 유지하면서.

특정 상황에 따라 더 나은 기능 이름을 얻을 수도 있습니다.


답변

이것은 Martijns의 첫 번째 예의 변형입니다. 또한 단락을 허용하기 위해 “콜 러블 컬렉션”스타일을 사용합니다.

루프 대신 내장을 사용할 수 있습니다 any.

conditions = (check_size, check_color, check_tone, check_flavor)
return any(condition() for condition in conditions) 

any부울 을 반환하므로 확인의 정확한 반환 값이 필요한 경우이 솔루션이 작동하지 않습니다. any구분하지 않습니다 14, 'red', 'sharp', 'spicy'반환 값으로, 그들은 모두 반환됩니다 True.


답변

if x: return x한 줄에 모두 쓰는 것을 고려해 보셨습니까 ?

def check_all_conditions():
    x = check_size()
    if x: return x

    x = check_color()
    if x: return x

    x = check_tone()
    if x: return x

    x = check_flavor()
    if x: return x

    return None

이것은 당신이 가진 것보다 덜 반복적 이지 는 않지만 IMNSHO는 꽤 부드럽게 읽습니다.