"With"블록에서 조건부로 코드를 실행하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1808675

  •  05-07-2019
  •  | 
  •  

문제

나는 이것이 기능을 학대하는 것 같아요. 그러나 나는 그것이 할 수 있는지 여부에 대해 여전히 궁금합니다. 나는 다음과 같은 일을하고 싶습니다.

with conditional(a):
    print 1

그래서 print 1 부분은 a == true 인 경우에만 실행됩니다. 이게 가능해?

편집 : 사람들이 아래에 언급 한 것처럼 이것은 끔찍한 스타일입니다. 단지 수수께끼 질문입니다. 마음의 희미한 마음을위한 것이 아니라 집에서 이것을 시도하지 마십시오.

도움이 되었습니까?

해결책

조건부가 이미 if 성명:

if a == True:
    print 1

그러나 당신이 단지 요구한다면 재미있는, 정답은 당신은 할 수 없습니다 진짜. 멈추기 위해 with 실행 컨텐츠, conditional 어떻게 든 실행을 중지해야합니다 __enter__ 방법. 그러나 그렇게 할 수있는 유일한 방법은 예외를 제기하는 것입니다. 즉, 다른 코드가 실행되지 않는다는 것은 with a try 처리 사례를위한 진술 a != True

편집하다: 내가 OP의 상태 사용에 대한 의견과 투표에서 기소 된 것을 본다 (a == True) 나는 그것을 바꾸는 것을 고려했다 if a, 물론 조건부 테스트를위한 파이썬의 관용구입니다. 하지만 우리는 몰라요 OP가 생각한 것과 그가 정말로 원하는지 여부 a 부울이 되려면 블록을 실행하고 싶지 않습니다. a = [1] (통과 할 것입니다 if a) 나 그대로두기로 결정했습니다.

다른 팁

if a is True:
    print 1

with 성명 신뢰할 수있는 EXIT 컨텍스트를 제공하기위한 것입니다.

내가 보는 유일한 방법은 예외를 제기하는 것입니다. conditional 그 주장이 거짓 인 경우. 그만큼 with 본체는 실행되지 않지만 다음과 같은 코드도 except 또는 finally 물론 조항.

__enter__ 및 __exit__ 함수가있는 클래스 A가 있다고 가정 해 봅시다.

class A:
    def __init__(self, i):
        self.b = i
    def __exit__(*args, **kwargs):
        print "exit"
    def __enter__(*args, **kwargs):
        print "enter"

그리고 객체 C의 b가 1과 같은지 확인하는 함수 b는 전달됩니다.

def b(c):
    if c.b == 1:
        return c
    else:
        pass

나는 달성 할 수있다 :

with b(A(1)):
    print 10


enter
10
exit

그러나 B가 통과하면 AttributeError가 ~와 함께 함께 일할 것이 없습니다. 해결책은 with b(A(1)): 내부에서 시도/블록을 제외하고. 그러나 나는 이것을하는 것이 좋지 않습니다.

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