[python] ‘if’문에서 여러 줄 조건을 스타일링합니까? [닫은]

때로는 ifs의 긴 조건 을 여러 줄로 나눕니다. 이를 수행하는 가장 확실한 방법은 다음과 같습니다.

  if (cond1 == 'val1' and cond2 == 'val2' and
      cond3 == 'val3' and cond4 == 'val4'):
      do_something

동작이 조건과 혼합되기 때문에 시각적으로별로 매력적이지 않습니다. 그러나 4 공백의 올바른 파이썬 들여 쓰기를 사용하는 자연스러운 방법입니다.

내가 사용하는 순간 :

  if (    cond1 == 'val1' and cond2 == 'val2' and
          cond3 == 'val3' and cond4 == 'val4'):
      do_something

그러나 이것은 매우 예쁘지 않습니다. 🙂

다른 방법을 추천 할 수 있습니까?



답변

두 번째 조건부 라인에는 4 개의 공백을 사용할 필요가 없습니다. 아마도 사용 :

if (cond1 == 'val1' and cond2 == 'val2' and
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

또한 공백이 생각보다 유연하다는 것을 잊지 마십시오.

if (
       cond1 == 'val1' and cond2 == 'val2' and
       cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something
if    (cond1 == 'val1' and cond2 == 'val2' and
       cond3 == 'val3' and cond4 == 'val4'):
    do_something

그러나 둘 다 상당히 추악합니다.

괄호를 잃을 수도 있습니다 ( 스타일 가이드 는 이것을 권장하지 않습니다)?

if cond1 == 'val1' and cond2 == 'val2' and \
   cond3 == 'val3' and cond4 == 'val4':
    do_something

이것은 적어도 당신에게 차별화를 제공합니다.

또는:

if cond1 == 'val1' and cond2 == 'val2' and \
                       cond3 == 'val3' and \
                       cond4 == 'val4':
    do_something

나는 내가 선호하는 것 같아 :

if cond1 == 'val1' and \
   cond2 == 'val2' and \
   cond3 == 'val3' and \
   cond4 == 'val4':
    do_something

다음은 스타일 가이드 입니다 (2010 년 이후) 괄호 사용을 권장합니다.


답변

나는 단순히 AND 또는 OR 인 퇴화 된 경우에 다음에 의지했습니다.

if all( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

if any( [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4'] ):

그것은 몇자를 면도하고 조건에 미묘함이 없음을 분명히합니다.


답변

누군가 가 여기에서 수직 공백의 사용을 옹호해야합니다! 🙂

if (     cond1 == val1
     and cond2 == val2
     and cond3 == val3
   ):
    do_stuff()

이것은 각 조건을 명확하게 보여줍니다. 또한보다 복잡한 조건을보다 명확하게 표현할 수 있습니다.

if (    cond1 == val1
     or
        (     cond2_1 == val2_1
          and cond2_2 >= val2_2
          and cond2_3 != bad2_3
        )
   ):
    do_more_stuff()

예, 우리는 명확성을 위해 약간의 수직 부동산을 거래하고 있습니다. 그만한 가치가 있습니다.


답변

나는 매우 큰 if 조건이있을 때이 스타일을 선호합니다.

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status=="HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()


답변

내 개인적인 견해는 다음과 같습니다. 장기 조건은 (불확실한) 부울 리턴 함수 / 메소드로 리팩토링을 제안하는 코드 냄새입니다. 예를 들면 다음과 같습니다.

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

이제 여러 줄 조건을보기 좋게 만들 수있는 방법을 찾게되면 아마도 그 내용이 만족스럽고 리팩토링을 건너 뛸 수있을 것입니다.

반면에, 나의 미적 감각을 교란시키는 것은 리팩토링에 대한 인센티브로 작용합니다.

따라서 필자의 결론은 여러 회선 조건이보기 흉한 것으로 보이며이를 피하기위한 동기가된다는 것입니다.


답변

이것은 크게 향상되지 않지만 …

allCondsAreOK = (cond1 == 'val1' and cond2 == 'val2' and
                 cond3 == 'val3' and cond4 == 'val4')

if allCondsAreOK:
   do_something


답변

and키워드를 두 번째 줄로 옮기고 조건을 포함하는 모든 줄을 4 개가 아닌 2 개의 공백으로 들여 쓰는 것이 좋습니다 .

if (cond1 == 'val1' and cond2 == 'val2'
  and cond3 == 'val3' and cond4 == 'val4'):
    do_something

이것이 바로 코드 에서이 문제를 해결하는 방법입니다. 키워드를 줄의 첫 단어로 사용하면 조건을보다 쉽게 ​​읽을 수 있으며 공간 수를 줄이면 조건과 동작을 더욱 구분할 수 있습니다.