문제

때때로 나는 긴 조건을 깨뜨린다 if여러 줄에 s. 이를 수행하는 가장 분명한 방법은 다음과 같습니다.

  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 년부터)는 브래킷 사용 권장입니다.

다른 팁

나는 단순히 또는 또는 또는 또는 또는 나오는 퇴화 케이스에서 다음에 의지했습니다.

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

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

내 개인적인 취향은 다음과 같습니다. 긴 조건은 (내 관점에서) 부울 회수 기능/방법으로 리팩토링을 제안하는 코드 냄새입니다. 예를 들어:

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

나는 굉장히 큰 if condition이있을 때이 스타일을 선호합니다.

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

나는 움직일 것을 제안한다 and 두 번째 줄에 대한 키워드와 4 개 대신 두 개의 공간으로 조건을 포함하는 모든 라인을 들여 쓰기

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

이것이 바로 내 코드 에서이 문제를 해결하는 방법입니다. 라인에서 첫 번째 단어로 키워드를 갖는 것은 조건을 훨씬 더 읽기 쉽게 만들고 공간 수를 줄이면 조건이 동작과 더 구별됩니다.

인용 할 가치가있는 것 같습니다 PEP 0008 (Python의 공식 스타일 가이드),이 문제에 대해 겸손한 길이로 댓글을 달기 때문입니다.

조건부 부분이있을 때 if -스탠딩은 여러 줄에 걸쳐 작성해야 할 정도로 길다. 두 문자 키워드의 조합 (즉 if ), 단일 공간과 개구부 괄호는 다층 조건부의 후속선에 대한 자연스러운 4 공간 들여 쓰기를 만듭니다. 이것은 내부에 중첩 된 압축 된 코드와 시각적 충돌을 일으킬 수 있습니다. if -자연스럽게 4 개의 공간에 들여 쓰기. 이 PEP는 이러한 조건부 라인을 내부의 중첩 된 스위트와 더 구별하는 방법에 대해 명시적인 위치를 차지하지 않습니다. if -성명. 이 상황에서 허용 가능한 옵션은 다음과 같습니다.

# 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 (cond1 == 'val1' and cond2 == 'val2'
    and cond3 == 'val3' and cond4 == 'val4'):
    do_something

부터 and 키워드이며 편집자에 의해 강조 표시되며 아래의 do_something과 충분히 다르게 보입니다.

개인적으로, 나는 긴 if 진술에 의미를 추가하고 싶습니다. 적절한 예를 찾으려면 코드를 검색해야하지만 여기에 가장 먼저 떠오르는 예는 다음과 같습니다. 여러 변수에 따라 특정 페이지를 표시하고 싶은 기발한 논리가 발생한다고 가정 해 봅시다.

영어 : "로그인 한 사용자가 관리자 교사가 아니라 정기적 인 교사 일 경우 학생이 아닌 경우 ..."

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

물론 이것은 괜찮아 보일지 모르지만 진술을 읽는 것은 많은 일입니다. 우리는 논리를 라벨에 할당하는 것은 어떻습니까? "레이블"은 실제로 변수 이름입니다.

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

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

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

변수를 사용하여 논리를 저장하고 라벨을 붙이지 않고 위의 조건을 작성해보십시오. 매우 지저분하고 읽기 어려운 논리적 진술로 끝날뿐만 아니라 자신을 반복했습니다. 합리적인 예외가 있지만 기억하십시오 : 자신을 반복하지 마십시오 (건조).

"All"과 "Aly"는 동일한 유형의 경우 많은 조건에 좋습니다. 그러나 그들은 항상 모든 조건을 평가합니다. 이 예에서 볼 수 있듯이 :

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 cond22 == "val2"
and cond333 == "val3" and cond4444 == "val4"):
    do_something

이것은 "및"및 "또는"또는 "(두 번째 줄에서 첫 번째 줄에 있어야 함)에 잘 작동하지만 다른 긴 조건에는 훨씬 적습니다. 다행히도, 전자는 더 일반적인 사례 인 것처럼 보이지만 후자는 종종 임시 변수로 쉽게 다시 작성됩니다. (일반적으로 어렵지는 않지만 "/"또는 "또는"다시 쓰는 시점의 단락을 보존하는 것은 어렵거나 덜 명백 할 수 있습니다.)

이 질문을 찾은 이후로 C ++에 대한 블로그 게시물, 나는 내 C ++ 스타일이 동일하다는 것을 포함하겠습니다.

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

@krawyoti가 말한 내용에 추가합니다 ... 장거리 조건은 읽기가 어렵고 이해하기 어렵 기 때문에 냄새가납니다. 함수 또는 변수를 사용하면 코드가 더 명확 해집니다. 파이썬에서는 수직 공간을 사용하고 괄호를 동봉하고 각 라인의 시작 부분에 논리 연산자를 놓아 표현이 "플로팅"처럼 보이지 않습니다.

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 기능은 거의 섞이지 않거나 비교하기 때문에 이것이 잘 작동하며 발전기 이해력으로 일찍 실패 할 수 있다는 추가적인 이점이 있습니다.

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 cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):

    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!"

Dunno가 당신에게 효과적이지만, 고려해야 할 또 다른 옵션입니다. 또 하나의 방법이 있습니다.

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 (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'
   ):
    do_something

이렇게하면 닫는 버팀대와 결장이 우리의 상태의 끝을 시각적으로 표시합니다.

나는 이것을 할 수있는 괜찮은 방법을 찾기 위해 고군분투하고 있었기 때문에, 나는 단지 아이디어를 생각해 냈습니다 (주로 맛의 문제이기 때문에은 총알이 아닙니다).

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

나는이 솔루션에서 내가 본 다른 사람들과 비교하여 몇 가지 장점을 발견합니다. 즉, 당신은 정확히 4 개의 들여 쓰기 공간 (bool)을 얻을 수 있습니다. 명확한 (ISH) 방법. 이것은 또한 부울 연산자의 단락 평가의 이점을 유지하지만 물론 기본적으로 아무것도하지 않는 함수 호출의 오버 헤드를 추가합니다. 당신은 인수를 반환하는 모든 기능이 Bool 대신 여기에서 사용될 수 있다고 주장 할 수 있지만, 내가 말했듯이, 그것은 단지 아이디어 일 뿐이며 궁극적으로 맛의 문제입니다.

내가 이것을 쓰고 "문제"에 대해 생각하면서 나는 충분히 재미있다. 또 다른 함수 호출의 오버 헤드를 제거하는 아이디어. 여분의 괄호 쌍을 사용하여 복잡한 상태에 빠지려고한다고 표시하지 않겠습니까? IF 문의 본문에 비해 하위 조건의 멋진 2 개의 공간에 대한 멋진 2 개의 공간을 제공하기 위해 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.

나는이 스레드가 오래된 것을 알고 있지만 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):

그리고 다른 솔루션을 iand 운영자:

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

if proceed:
    # do something

조건을 목록에 포장 한 다음 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 개 중 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 & Else 조건이 아래와 같이 쓸 수있는 것보다 여러 문장을 실행 해야하는 경우. 우리가 그 안에 하나의 진술이있는 다른 예제가있는 경우.

감사합니다.

#!/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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top