2009-11-27 5 views
0

나는이 좀 기능을 남용하고,하지만 난 여전히 그것을 할 수 있는지 궁금 생각 - 내가 좋아하는 뭔가하고 싶은 다음 print 1 부분 만 ==이 경우 실행되도록"with"블록에서 조건부로 코드를 실행할 수 있습니까?

with conditional(a): 
    print 1 

을 참된. 이것이 가능합니까?

편집 : 아래 사람 상태와 마찬가지로 이것은 끔찍한 스타일입니다. 수수께끼 일 뿐이에요. 없는 등

+4

나는 그 누구도 읽을 수없는 코드로 끝낼 것이라고 생각합니다!'if'는 아마도 가장 독창적 인 프로그래밍 구조 중 하나 일 것입니다. – jkp

+2

사람들은 펄 골프 (http://en.wikipedia.org/wiki/Perl_golf#Perl_golf)를하는 이유는 무엇입니까? 가끔은 당신이 그것을 할 수 있는지보기를 원합니다. – olamundo

+0

-1 : 제발하지 마세요. 부디. –

답변

8

는 조건문이 이미 if 문 사용하여 공급되기 때문에 그렇게 할 진짜 이유가 없다 : 당신은 그냥 재미을 요청하는 경우,

if a == True: 
    print 1 

을하지만, 대답은 당신이 할 수없는 입니다 정말입니다. with 콘텐츠 실행을 중지하려면 메서드에서 conditional이 어떻게 든 실행을 중지해야합니다. 내가 코멘트에 기소 된보고 및 ​​:하지만 그렇게 할 수있는 유일한 방법은 당신이 처리하는 경우 a != True

편집에 대한 try 문으로 with을 포장하지 않는 한 다른 코드가 실행되지 의미 예외를 제기한다 OP의 조건 (a == True)을 사용하여 투표하기 나는 이것을 조건문 테스트를위한 Python의 숙어 인 if a으로 바꾸는 것을 고려했다. 그러나 우리는 을 모른다. OP가 염두에 두었던 점과 그가 실제로 부울이 되길 원하는지 여부는 (어느 쪽이 if a을 전달할 것인가) 인 경우 으로 남겨두기로 결정했다. 입니다.

+2

-1 :'if a == True'. 그냥 '만약'이라고 말하십시오. –

+4

@ S.Lott : 질문에 필요한 것과 정확히 일치하기 때문에 응답을 왜곡하지 않아도됩니다. "a == True' 인 경우에만"라는 질문입니다. –

+0

-1 : S.Lott은 완전히 옳습니다. 이것은 끔찍한 스타일입니다. – nikow

4
if a is True: 
    print 1 

with statement 심장 약한, 집에서 시도하지 마십시오는 신뢰할 수있는 입력 - 종료 내용을 제공하기위한 것이다.

+1

나는 당신이 차를 코카콜라로 달릴 수 있는지를 묻고 있었고, 당신은 "연료를 사용해야한다"고 대답했다. :) 내가 말했듯이, 이것은 기능을 남용하는 것이지만 프로그래밍 수수께끼라고 생각한다. ? – olamundo

2

유일한 방법은 인수가 false 인 경우 conditional에 예외를 발생시키는 것입니다. with 본문은 실행되지 않지만 뒤 따르는 코드도 마찬가지입니다. 물론 except 또는 finally 절까지.

0

의이 내가 __enter__와 __exit__ 기능 클래스 A가 있다고 가정 해 봅시다 : 객체에 다 다른 1에 해당 b를가 통과 할 경우 확인합니다

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

그리고 함수 B를.

with b(A(1)): 
    print 10 


enter 
10 
exit 

을하지만 B는 작업 할 아무것도하지 않습니다와 로 통과하면 그것은 AttributeError가 발생합니다 :

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

내가 얻을 수 있습니다. 해결책은 try/except 블록 안에 with b(A(1)):을 넣는 것입니다. 그러나 나는 이것을하는 것을 권장하지 않는다.

+0

이 A''에 전달 된 것 1 이외의 값이 작동하지 않습니다 파일 "", 라인 1, B와 (A (2))에서 : AttributeError : 'NoneType'객체에 '__exit__'속성이 없습니다. 'b '의'pass'가 유효한 컨텍스트 관리자를 반환하지 않기 때문입니다. – abyx

+0

확실한 것은 조건이 명시된대로 실패하면 AttributeError를 throw합니다. – ikkebr

+0

인수에'b' 속성이 없으면 오류가 발생하지만 실패하더라도 'c.b! = 1'이면 실패합니다. – abyx

관련 문제