더 구체적으로 말하면 with EXPR: BLOCK
문에 EXPR
이라는 함수가 있는지 감지 할 수 있습니까? 저는 파이썬에서 with
-statement의 사용법에 익숙해 지려고합니다. 첫 번째 단계로, the reference의 contextlib.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/>
, 그것을 행할 것 같다. 그러나이 탐지가 가능한지 여부는 알 수 없습니다. 그런 방법이 있을까요, 있다면, 어떻게?
설명서에 "이것은 HTML을 생성하는 실제 방법으로 권장하지 않습니다!"라는 메시지가 표시됩니다. 어쩌면 이것은 가설적인 예일 수도 있지만 그렇지 않다면 이것을하지 마십시오. :) –
경고를 상기시켜 주셔서 감사합니다. 예, 저는 그것을 알고 있었으며이 질문은 가설입니다. 대답 (Amber 및 PEP 0343, 내가 묻기 전에 읽어야 했음)이 그렇지 않은 경우,이 구조 작업을 수행하기 위해 좀 더 많은 노력을했을 것입니다. 아아, 그렇지 않아야했습니다. 그러니 걱정하지 마세요,이 실패한 추적은 내 머리에 안전하게 고정되어 있습니다 :) –