"With"블록에서 조건부로 코드를 실행하려면 어떻게해야합니까?
-
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)):
내부에서 시도/블록을 제외하고. 그러나 나는 이것을하는 것이 좋지 않습니다.