programing

'if' 문장에서 여러 줄의 조건을 스타일링합니까?

javaba 2022. 10. 6. 21:25
반응형

'if' 문장에서 여러 줄의 조건을 스타일링합니까?

나는 긴 도 한다.if를 여러 줄에 배치합니다.가장 확실한 방법은 다음과 같습니다.

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

시각적으로 별로 매력적이지 않아요. 왜냐하면 그 동작은 조건과 잘 어울리거든요.그러나 4칸의 올바른 Python 들여쓰기를 사용하는 것은 자연스러운 방법입니다.

현재 사용하고 있는 것은 다음과 같습니다.

  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

저는 다음을 선호합니다.

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

네, 우리는 명확성을 위해 수직 부동산을 교환하고 있습니다.IMO는 그만한 가치가 있어.

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

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

별로 나아지진 않지만...

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

if allCondsAreOK:
   do_something

여기 제 개인적인 생각이 있습니다. 긴 조건은 부울 되돌리기 함수/메서드로 리팩터링을 제안하는 코드 냄새입니다.예를 들어 다음과 같습니다.

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

여러 줄의 조건을 보기 좋게 만드는 방법을 찾아낸다면, 저는 아마 그것들을 가지고 있는 것에 만족하고 리팩터링을 생략할 것입니다.

반면에, 그것들을 나의 미적 감각을 교란시키는 것은 리팩터링의 동기가 된다.

따라서 내 결론은 다중 라인 조건은 보기 흉하게 보여야 하며 이는 그것들을 피하기 위한 동기부여가 된다는 것이다.

을 옮기는 것이 .and 번째 하고 두 이 있는 하는 모든 행을 합니다. 즉 4개의 2개의 공백으로 합니다.

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

내 코드의 이 문제는 바로 이렇게 해결됩니다.키워드를 행의 첫 번째 단어로 하면 조건이 훨씬 읽기 쉬워지고 공백 수를 줄이면 조건과 동작을 더욱 구별할 수 있다.

PEP 0008(Python의 공식 스타일 가이드)을 인용할 가치가 있는 것 같습니다.왜냐하면 PEP 0008은 이 문제에 대해 적당한 길이의 코멘트를 하고 있기 때문입니다.

if줄에 쓸 두 의 문자 " "는"의 할 필요가 .if에 공백이 되고, 여는 되어 여러 줄에 대해 에 공백이 1개 추가되고, 여는 괄호가 추가되어 여러 줄 조건부 후속 행에 대해 자연스럽게 4공간 들여쓰기가 작성됩니다.로 인해, 「」, 「」의 되어 있는 인 경합이 이 있습니다.if-스테이트먼트(statement)는 자연스럽게 4칸으로 들여씁니다.는, 회선을, 「PEP」하는 방법 그 유무)에인 입장을 .if- statement - . - 스테이트먼트.할 수 .

# No extra indentation.
if (this_is_one_thing and
    that_is_another_thing):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

위의 인용문에는 "제한되지 않음"이 기재되어 있습니다.스타일 가이드에 제시된 접근법 외에 이 질문에 대한 다른 답변에서도 일부 권장되는 접근법도 사용할 수 있습니다.

제가 하는 일은 이렇습니다. "모든 것"과 "모든 것"은 반복할 수 있는 것을 받아들인다는 것을 기억하십시오. 그래서 저는 긴 조건을 목록에 넣고 "모든 것"이 그 일을 하게 합니다.

condition = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']

if all(condition):
   do_something

개인적으로, 저는 긴 if-statement에 의미를 더하는 것을 좋아합니다.적절한 예를 찾기 위해 코드를 검색해야 합니다.하지만 여기 첫 번째 예가 있습니다.여러 변수에 따라 특정 페이지를 표시하고 싶은 기발한 논리에 부딪혔다고 가정해 보겠습니다.

영어: "로그인한 사용자가 관리자 교사가 아닌 일반 교사일 뿐 학생 자체가 아닌 경우.."

if not user.isAdmin() and user.isTeacher() and not user.isStudent():
    doSomething()

물론 이것은 괜찮아 보일 수 있지만, 진술서를 읽는 것은 많은 일이다.이치에 맞는 라벨을 붙이는 게 어때요?"label"은 실제로 변수 이름입니다.

displayTeacherPanel = not user.isAdmin() and user.isTeacher() and not user.isStudent()
if displayTeacherPanel:
    showTeacherPanel()

이것은 어리석게 보일 수 있지만, 교사 패널을 표시하거나 사용자가 기본적으로 다른 특정 패널에 액세스할 수 있는 경우에만 다른 항목을 표시하려는 다른 조건이 있을 수 있습니다.

if displayTeacherPanel or user.canSeeSpecialPanel():
    showSpecialPanel()

논리를 저장하고 라벨을 붙이기 위해 변수를 사용하지 않고 위의 조건을 써보세요.그리고 당신은 매우 지저분하고 읽기 어려운 논리적인 문장으로 끝날 뿐만 아니라, 당신은 단지 반복했을 뿐입니다.합리적인 예외가 있지만 다음 사항에 유의하십시오.반복하지 마세요(건조).

@krawyoti가 말한 것까지 더하면...긴 상태는 읽기 어렵고 이해하기 어렵기 때문에 냄새가 난다.함수 또는 변수를 사용하면 코드가 더 명확해집니다.Python에서는 수직 공간을 사용하여 괄호를 묶고 각 행의 선두에 논리 연산자를 배치하여 표현식이 "떠다니는" 것처럼 보이지 않도록 합니다.

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

을 여러가 있는 ( 「」등 )는 다음과 같습니다.while로컬 기능을 사용하는 것이 가장 좋습니다.

단순하고 단순하며 pep8 검사도 통과합니다.

if (
    cond1 and
    cond2
):
    print("Hello World!")

저는 '아주 좋다'를 .all ★★★★★★★★★★★★★★★★★」any함수는 거의 혼재 및/또는 비교를 하지 않기 때문에 잘 작동하며 제너레이터 이해와 함께 Failure Early라는 추가적인 장점이 있습니다.

if all([
    cond1,
    cond2,
]):
    print("Hello World!")

단 한 번이라도 통과해야 한다는 것만 잊지 마세요!N-인수 전달은 올바르지 않습니다.

★★★★★★any 와 같다or ★★★★all 와 같다and★★★★★★ 。


이는 제너레이터의 이해와 잘 결합됩니다. 예를 들어 다음과 같습니다.

# Check if every string in a list contains a substring:
my_list = [
    'a substring is like a string', 
    'another substring'
]

if all('substring' in item for item in my_list):
   print("Hello World!")

# or

if all(
    'substring' in item
    for item in my_list
):
    print("Hello World!")

상세 내용: 제너레이터 이해

(고정 폭의 이름은 실제 코드를 나타내지 않고 적어도 실제 코드를 나타내지 않기 때문에 식별자를 가볍게 수정했습니다.)

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

이 방법은 "and" 및 "or" (첫 번째 줄에 있는 것이 중요함)에서는 잘 작동하지만 다른 긴 조건에서는 훨씬 덜 작동합니다.다행히도 전자가 더 일반적인 경우인 반면 후자는 종종 임시 변수로 쉽게 고쳐 쓴다.(보통 어렵지는 않지만, 고쳐 쓸 때 "and"/"또는 "or"의 단락을 유지하는 것은 어렵거나 훨씬 덜 명확할 수 있습니다.)

당신의 블로그 투고에서 C++관한 질문을 발견했으므로, 제 C++ 스타일은 동일합니다.

if (cond1 == "val1" and cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4") {
    do_something
}

내가 선호하는 솔루션을 보지 못해 놀랐지만

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

★★and키워드입니다.이 키워드는 에디터에 의해 강조 표시되어 있습니다.어떤 일을 하다

"all"과 "any"는 동일한 유형의 케이스의 많은 조건에 적합합니다.하지만 그들은 항상 모든 조건을 평가합니다.다음 예시와 같이

def c1():
    print " Executed c1"
    return False
def c2():
    print " Executed c2"
    return False


print "simple and (aborts early!)"
if c1() and c2():
    pass

print

print "all (executes all :( )"
if all((c1(),c2())):
    pass

print

조건과 본문 사이에 공백선만 하나 더 삽입하고 나머지는 표준적인 방법으로 하면 어떨까요?

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

    do_something

p.s. 항상 공백이 아닌 탭을 사용합니다. 미세 조정이 안 됩니다.

내가 주로 하는 일은:

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

이렇게 해서 폐쇄 브레이스와 결장은 우리 상태가 끝났음을 시각적으로 나타냅니다.

이 스레드가 오래된 것은 알지만 Python 2.7 코드를 가지고 있으며 PyCharm(4.5)은 여전히 이 케이스에 대해 불평하고 있습니다.

if foo is not None:
    if (cond1 == 'val1' and cond2 == 'val2' and
        cond3 == 'val3' and cond4 == 'val4'):
            # some comment about do_something
            do_something

PEP8 경고 "다음 논리 행과 같은 들여쓰기로 시각적으로 들여쓰기된 행"을 표시해도 실제 코드는 완전히 정상입니까?'과잉 인텐션'이 아니에요?

Python이 참고 그냥 곱슬곱슬하게 갈고 닦았으면 좋았을 때가 있어요.지난 몇 년 동안 실수로 잘못된 표시로 인해 몇 개의 버그가 발생했는지 궁금합니다.

if 스테이트먼트에 대해 복수 조건을 제시하는 모든 응답자는 제시된 문제만큼 추악하다.같은 방법으로 이 문제를 해결할 수는 없습니다.

심지어 PEP 0008의 답변도 혐오스럽다.

여기 훨씬 더 읽기 쉬운 접근법이 있습니다.

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

내가 한 말 취소할까요?멀티컨디션이 필요하시다고 설득해주시면 제가 말 그대로 인쇄해서 먹겠습니다.

약간의 반전이 있으면 @zkanda의 솔루션이 좋다고 생각합니다.조건과 값이 각각의 목록에 있는 경우 목록 이해를 사용하여 비교를 수행할 수 있습니다. 그러면 조건/값 쌍을 추가하는 것이 좀 더 일반적입니다.

conditions = [1, 2, 3, 4]
values = [1, 2, 3, 4]
if all([c==v for c, v in zip(conditions, values)]):
    # do something

만약 내가 이런 문장을 하드코드로 만들고 싶다면, 나는 읽기 쉽도록 이렇게 쓸 것이다.

if (condition1==value1) and (condition2==value2) and \
   (condition3==value3) and (condition4==value4):

오퍼레이터와 함께 다른 솔루션을 제안해 보겠습니다.

proceed = True
for c, v in zip(conditions, values):
    proceed &= c==v

if proceed:
    # do something

완성도를 위해 몇 가지 다른 무작위 아이디어만 있으면 됩니다.만약 그들이 당신에게 도움이 된다면, 그것들을 사용하세요.그렇지 않으면 다른 걸 시도하는 게 나을 거예요.

사전에서도 이 작업을 수행할 수 있습니다.

>>> x = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> y = {'cond1' : 'val1', 'cond2' : 'val2'}
>>> x == y
True

이 옵션은 더 복잡하지만 다음과 같이 유용할 수도 있습니다.

class Klass(object):
    def __init__(self, some_vars):
        #initialize conditions here
    def __nonzero__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
                self.cond3 == 'val3' and self.cond4 == 'val4')

foo = Klass()
if foo:
    print "foo is true!"
else:
    print "foo is false!"

그것이 당신에게 도움이 될지는 모르겠지만, 고려해야 할 또 다른 옵션입니다.한 가지 방법이 더 있습니다.

class Klass(object):
    def __init__(self):
        #initialize conditions here
    def __eq__(self):
        return (self.cond1 == 'val1' and self.cond2 == 'val2' and
               self.cond3 == 'val3' and self.cond4 == 'val4')

x = Klass(some_values)
y = Klass(some_other_values)
if x == y:
    print 'x == y'
else:
    print 'x!=y'

마지막 두 가지는 테스트하지 않았지만, 콘셉트로는 충분할 겁니다.

(그리고 참고로, 이것이 일회성이라면 처음에 제시한 방법을 사용하는 것이 좋을 것입니다.많은 장소에서 비교하고 있는 경우, 이러한 방법을 사용하면, 어느 정도의 해킹을 하고 있는 것에 대해 그다지 불쾌해하지 않을 정도로 가독성이 향상될 가능성이 있습니다.)

나도 이것을 할 수 있는 좋은 방법을 찾기 위해 고군분투하고 있었기 때문에 (이것은 주로 취향의 문제이기 때문에 은빛 총알이 아니라) 아이디어가 떠올랐습니다.

if bool(condition1 and
        condition2 and
        ...
        conditionN):
    foo()
    bar()

이 솔루션에서는 지금까지 본 솔루션과 비교하여 몇 가지 장점이 있습니다.즉, 정확히 4칸의 들여쓰기(부울)가 추가되어 모든 조건이 수직으로 정렬할 수 있으며 if 스테이트먼트의 본문을 명확하게 들여쓸 수 있다는 것입니다.이것에 의해 부울 연산자의 단락 평가의 이점도 유지되지만, 물론 기본적으로 아무것도 하지 않는 함수 호출의 오버헤드가 추가됩니다.어떤 함수도 여기서 bool 대신 사용할 수 있다고 주장할 수 있지만, 말했듯이 그것은 단지 아이디어일 뿐이고 궁극적으로는 취향의 문제이다.

이상하게도 이 글을 쓰면서 '문제'에 대해 고민하던 중 함수 호출의 오버헤드를 없애는 또 다른 아이디어가 떠올랐습니다.추가 괄호 쌍을 사용하여 복잡한 조건을 입력하려고 한다는 것을 나타내면 어떨까요?예를 들어, if 스테이트먼트의 본문에 상대적인 하위 조건의 공백 2개를 더 입력합니다.예제:

if (((foo and
      bar and
      frob and
      ninja_bear))):
    do_stuff()

내가 이런 걸 좋아하는 이유는 이걸 보면 머릿속에서 "이봐, 뭔가 복잡한 일이 벌어지고 있어!"라는 벨이 즉시 울리기 때문이야.네, 괄호가 가독성에 도움이 되지 않는다는 것은 알지만, 이러한 상태는 거의 나타나지 않을 것입니다.또, 이러한 상태가 나타나면, 어쨌든 (복잡하기 때문에) 신중하게 읽어야 합니다.

어쨌든, 여기서 못 본 제안서가 두 개 더 있어요.이것이 누군가에게 도움이 되기를 바랍니다:)

두 줄로 나눌 수 있습니다.

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

한 번에 한 가지 조건을 추가할 수도 있습니다.그렇게 하면 적어도 어수선한 것과if.

조건을 목록으로 정리한 다음 smth를 수행합니다.예를 들어 다음과 같습니다.

if False not in Conditions:
    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

이 경우 들여쓰기가 4의 배수여야 할 이유는 없습니다. 예를 들어 "열기 구분 기호와 정렬"을 참조하십시오.

http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Indentation#Indentation

또 다른 접근방식은 다음과 같습니다.

cond_list = ['cond1 == "val1"','cond2=="val2"','cond3=="val3"','cond4=="val4"']
if all([eval(i) for i in cond_list]):
 do something

또한 목록에 다른 조건을 추가하는 것만으로 if 문을 변경하지 않고 다른 조건을 쉽게 추가할 수 있습니다.

cond_list.append('cond5=="val5"')

주로 사용하는 것은 다음과 같습니다.

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

if & other 조건이 그 안에서 여러 개의 스테이트먼트를 실행해야 할 경우 다음과 같이 쓸 수 있습니다.그 안에 하나의 스테이트먼트가 들어 있는 if의 예를 볼 때마다.

잘 먹혀들어서 고마워요.

#!/usr/bin/python
import sys
numberOfArgument =len(sys.argv)
weblogic_username =''
weblogic_password = ''
weblogic_admin_server_host =''
weblogic_admin_server_port =''


if numberOfArgument == 5:
        weblogic_username = sys.argv[1]
        weblogic_password = sys.argv[2]
        weblogic_admin_server_host =sys.argv[3]
        weblogic_admin_server_port=sys.argv[4]
elif numberOfArgument <5:
        print " weblogic UserName, weblogic Password and weblogic host details are Mandatory like, defalutUser, passwordForDefaultUser, t3s://server.domainname:7001 ."
        weblogic_username = raw_input("Enter Weblogic user Name")
        weblogic_password = raw_input('Enter Weblogic user Password')
        weblogic_admin_server_host = raw_input('Enter Weblogic admin host ')
        weblogic_admin_server_port = raw_input('Enter Weblogic admin port')
#enfelif
#endIf

죄송합니다. 저는 #Python에 대해 잘 모릅니다만, 3D BIM 모델링에서 자신의 객체를 스크립팅할 때 비슷한 것을 발견했기 때문에 알고리즘을 python에 맞게 조정하겠습니다.

여기서 발견한 문제는 양면성입니다.

  1. 이 문자를 해독하려는 사람치고는 내 가치관이 다른 것 같아.
  2. 코드 유지보수는 값이 변경되거나(가장 가능성이 높은 경우), 또는 새로운 조건을 추가해야 하는 경우(스키마 중단)에 비용이 많이 듭니다.

이 모든 문제를 회피하려면 스크립트는 다음과 같이 해야 합니다.

param_Val01 = Value 01   #give a meaningful name for param_Val(i) preferable an integer
param_Val02 = Value 02
param_Val03 = Value 03
param_Val04 = Value 04   # and ... etc

conditions = 0           # this is a value placeholder

########
Add script that if true will make:

conditions = conditions + param_Val01   #value of placeholder is updated
########

### repeat as needed


if conditions = param_Val01 + param_Val02 + param_Val03 + param_Val04:
    do something

이 방법의 장점:

  1. 스크립트를 읽을 수 있습니다.

  2. 스크립트를 쉽게 관리할 수 있습니다.

  3. conditions는 원하는 조건을 나타내는 값의 합계와의 1 비교 연산입니다.
  4. 다단계 조건 불필요

모두에게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/181530/styling-multi-line-conditions-in-if-statements

반응형