2011-01-15 2 views
1

더 구체적으로 말하면 with EXPR: BLOCK 문에 EXPR이라는 함수가 있는지 감지 할 수 있습니까? 저는 파이썬에서 with -statement의 사용법에 익숙해 지려고합니다. 첫 번째 단계로, the referencecontextlib.contextmanager에 표시된 마크 업 된 텍스트를 생성하는 예제를 다시 구현했습니다 (지금은 예외 처리를 무시함).'with'문에서 호출되는지 여부를 감지하는 함수를 작성할 수 있습니까?

class Markup(object): 
    def __init__(self): 
     self.tags = [] 
     self.append = self.tags.append 
     self.pop = self.tags.pop 

    def tag(self, name): 
     self.append(name) 
     return self 

    def __enter__(self): 
     print('<{}>'.format(self.tags[-1])) 

    def __exit__(self, exc_type, exc_value, traceback): 
     print('</{}>'.format(self.pop())) 

>>> m = Markup() 
>>> with m.tag('ELEMENT'): 
...  print('sample text') 
... 
<ELEMENT> 
sample text 
</ELEMENT> 

예상대로 작동합니다. 그럼, tag()도 빈 요소를 생성 할 수 있는지 생각하고 있어요 : 호출 수신자가 -statement with에서 호출하거나하지 않는 경우 감지 할 수 있다면 내 순진한 눈에

>>> m = Markup() 

# if a function appears as EXPR of "with EXPR: BLOCK", 'ELEMENT' is a container element. . 
>>> with m.tag('ELEMENT'): 
...  print('sample text') 
... 
<ELEMENT> 
sample text 
</ELEMENT> 

# in other cases, ELEMENT is an empty element. 
>>> m.tag('ELEMENT') 
<ELEMENT/> 

, 그것을 행할 것 같다. 그러나이 탐지가 가능한지 여부는 알 수 없습니다. 그런 방법이 있을까요, 있다면, 어떻게?

+0

설명서에 "이것은 HTML을 생성하는 실제 방법으로 권장하지 않습니다!"라는 메시지가 표시됩니다. 어쩌면 이것은 가설적인 예일 수도 있지만 그렇지 않다면 이것을하지 마십시오. :) –

+0

경고를 상기시켜 주셔서 감사합니다. 예, 저는 그것을 알고 있었으며이 질문은 가설입니다. 대답 (Amber 및 PEP 0343, 내가 묻기 전에 읽어야 했음)이 그렇지 않은 경우,이 구조 작업을 수행하기 위해 좀 더 많은 노력을했을 것입니다. 아아, 그렇지 않아야했습니다. 그러니 걱정하지 마세요,이 실패한 추적은 내 머리에 안전하게 고정되어 있습니다 :) –

답변

5

실제로 tag()을 "with"에서 호출하지 않았습니다. tag()을 호출 한 다음 tag()의 반환 값을 with 문으로 전달한 다음 전달 된 값에서 __enter__을 호출 한 다음 본문을 실행 한 다음 __exit__을 호출합니다.

따라서 실제로는 (tag()이 호출 된 이후) 호출되기 전에 with 문을 감지 할 수 없습니다.

+0

간결한 답변 감사합니다. 당신의 대답은 내가 듣고 싶은 것이 아니지만, 이것은 그림자를 쫓지 않고 나를 구할 수 있습니다 :) –

관련 문제